Apache2::Request in PerlInitHandler and PerlAuthenHandler

Apache2::Request in PerlInitHandler and PerlAuthenHandler

am 14.10.2008 10:28:33 von Shibi NS

------=_Part_847_29854430.1223972913663
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

I have following Location directive in my applications conf file


PerlInitHandler ARULink::setup_request
SetHandler perl-script
PerlResponseHandler ARULink::handler
PerlOptions +ParseHeaders +GlobalRequest
Options ExecCGI
AuthName Metalink
AuthType Basic
PerlAuthenHandler ARULink::MetalinkAuth
require valid-user
ErrorDocument 401 /handle_auth_failure



And the ARULink::MetalinkAuth::handler is

sub handler
{
my ($req) = @_;

my $status;
my $username;
my $userid;
my $email;

#
# Create a Session object.
#
my $req_params = $req->args;
my $cgi = CGI->new($req_params);
my $session = ARU::Session::get_cgi_session($cgi);
$req->subprocess_env;

....
}

When my handler reaches line '(my $cgi = new CGI($params);)' the
application is spinning ,seems like $req->args is returning null and
application line number 354 of CGI which is $req->subprocess_env;

Error from log file

Warning:
Deep recursion on subroutine "CGI::new" at /m/isd/pm/ARULink/MetalinkAuth.pm
line 114.


Line File Sub Called Arg
WntA
---- ---- ---------- ---
----
359 Debug.pm Debug::stack_trace Y
N
114 MetalinkAuth.pm Debug::__ANON__ Y
N
114 MetalinkAuth.pm CGI::new Y
N
354 CGI.pm ARULink::MetalinkAuth::handler Y
N

...

Any idea how can we get the $req->args which contains request information
in PerlAuthenHandler or PerlInitHandler

--Shibi Ns--

------=_Part_847_29854430.1223972913663
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

I have following Location directive in my applications conf file

<Location ~ ^/((download|ARULink|WebApp)/.*)?$>
PerlInitHandler         ARULink::setup_request
SetHandler              perl-script

PerlResponseHandler     ARULink::handler
PerlOptions             +ParseHeaders +GlobalRequest
Options                 ExecCGI
AuthName                Metalink
AuthType                Basic
PerlAuthenHandler       ARULink::MetalinkAuth

require                 valid-user
ErrorDocument           401 /handle_auth_failure
</Location>


And the ARULink::MetalinkAuth::handler is

sub handler

{
    my ($req) = @_;

    my $status;
    my $username;
    my $userid;
    my $email;

    #
    # Create a Session object.
    #
    my $req_params = $req->args;
    my $cgi        = CGI->new($req_params);

    my $session    = ARU::Session::get_cgi_session($cgi);
    $req->subprocess_env;

    ....
}

When my handler reaches line '(my $cgi    = new CGI($params);)' the application is spinning ,seems like $req->args is returning null and application line number 354 of CGI which is $req->subprocess_env;


Error from log file

Warning:

Deep recursion on subroutine "CGI::new" at /m/isd/pm/ARULink/MetalinkAuth.pm line 114.





Line File                 Sub Called                                    Arg WntA

---- ----                 ----------                                    --- ----

 359 Debug.pm             Debug::stack_trace                             Y   N

 114 MetalinkAuth.pm      Debug::__ANON__                                Y   N

 114 MetalinkAuth.pm      CGI::new                                       Y   N

 354 CGI.pm               ARULink::MetalinkAuth::handler                 Y   N



...



Any idea how can we get the $req->args which contains request information  in PerlAuthenHandler  or PerlInitHandler

--Shibi Ns--



------=_Part_847_29854430.1223972913663--

Re: Apache2::Request in PerlInitHandler and PerlAuthenHandler

am 14.10.2008 11:12:19 von aw

Hi.

It usually helps for any kind of support issue, if you provide some
information about where this is happening : what platform, which Apache
version, which perl version, which mod_perl version, etc..

Now, below :
> SetHandler perl-script
is used when your purpose is to run a "traditional" cgi-bin script under
mod_perl, not for embedded modules like your
> PerlResponseHandler ARULink::handler
would indicate.
I suggest you try replacing this first by
SetHandler modperl

For the same reason, the line
> Options ExecCGI
is not necessary, since you are not executing any cgi-bin scripts in
that directory, only mod_perl handlers.

Additionally, I am not quite sure of your line
> my $cgi = CGI->new($req_params);
I believe you should rather use
> my $cgi = CGI->new($req);
The CGI.pm module is smart enough, given the correct environment, to
figure out that it is running under mod_perl, and then use the request
object ($req) as a base to build the CGI object.

The above may well be why the CGI.pm library module is getting confused,
and spinning. So try the changes first, and come back if it still has a
problem.


Shibi NS wrote:
> I have following Location directive in my applications conf file
>
>
> PerlInitHandler ARULink::setup_request
> SetHandler perl-script
> PerlResponseHandler ARULink::handler
> PerlOptions +ParseHeaders +GlobalRequest
> Options ExecCGI
> AuthName Metalink
> AuthType Basic
> PerlAuthenHandler ARULink::MetalinkAuth
> require valid-user
> ErrorDocument 401 /handle_auth_failure
>

>
>
> And the ARULink::MetalinkAuth::handler is
>
> sub handler
> {
> my ($req) = @_;
>
> my $status;
> my $username;
> my $userid;
> my $email;
>
> #
> # Create a Session object.
> #
> my $req_params = $req->args;
> my $cgi = CGI->new($req_params);
> my $session = ARU::Session::get_cgi_session($cgi);
> $req->subprocess_env;
>
> ....
> }
>
> When my handler reaches line '(my $cgi = new CGI($params);)' the
> application is spinning ,seems like $req->args is returning null and
> application line number 354 of CGI which is $req->subprocess_env;
>
> Error from log file
>
> Warning:
> Deep recursion on subroutine "CGI::new" at /m/isd/pm/ARULink/MetalinkAuth.pm
> line 114.
>
>
> Line File Sub Called Arg
> WntA
> ---- ---- ---------- ---
> ----
> 359 Debug.pm Debug::stack_trace Y
> N
> 114 MetalinkAuth.pm Debug::__ANON__ Y
> N
> 114 MetalinkAuth.pm CGI::new Y
> N
> 354 CGI.pm ARULink::MetalinkAuth::handler Y
> N
>
> ..
>
> Any idea how can we get the $req->args which contains request information
> in PerlAuthenHandler or PerlInitHandler
>
> --Shibi Ns--
>

Re: Apache2::Request in PerlInitHandler and PerlAuthenHandler

am 14.10.2008 12:50:59 von torsten.foertsch

On Tue 14 Oct 2008, Shibi NS wrote:
> And the ARULink::MetalinkAuth::handler is
>
> sub handler
> {
> my ($req) =3D @_;
>
> my $status;
> my $username;
> my $userid;
> my $email;
>
> #
> # Create a Session object.
> #
> my $req_params =3D $req->args;
> my $cgi =3D CGI->new($req_params);
> my $session =3D ARU::Session::get_cgi_session($cgi);
> $req->subprocess_env;
>
> ....
> }
>
> When my handler reaches line '(my $cgi =3D new CGI($params);)' the
> application is spinning ,seems like $req->args is returning null and
> application line number 354 of CGI which is $req->subprocess_env;
>
> Error from log file
>
> Warning:
> Deep recursion on subroutine "CGI::new" at
> /m/isd/pm/ARULink/MetalinkAuth.pm line 114.

Don't know about CGI in this context but is there any chance to switch=20
to Apache2::Request (libapreq2)?

If you really see an empty $r->args at that stage while you are certain=20
to have passed something then it is an error in mod_perl. Try to create=20
a test case as short and simple as you can and file a bugreport.

Try something like

warn "params: ".$req->args;

The warning will appear in the error_log.

Can you please be more detailed about where it spins in CGI.pm? My=20
version 3.29 looks like:

350 if ($MOD_PERL) {
351 if ($MOD_PERL == 1) {
352 $self->r(Apache->request) unless $self->r;
353 my $r =3D $self->r;
354 $r->register_cleanup(\&CGI::_reset_globals);
355 }
356 else {
357 # XXX: once we have the new API
358 # will do a real PerlOptions -SetupEnv check
359 $self->r(Apache2::RequestUtil->request) unless $self->r;
360 my $r =3D $self->r;
361 $r->subprocess_env unless exists $ENV{REQUEST_METHOD};
362 $r->pool->cleanup_register(\&CGI::_reset_globals);
363 }
364 undef $NPH;
365 }

Line 354 is somewhere in the mp1 code path. The mp2 code path looks=20
correct for me. Apache2::RequestUtil->request is set up in=20
postreadrequest and again in headerparser if +GlobalRequest.=20
cleanup_register() is also allowed here.

Ah, does your code check for a subrequest? Something like "return ... if=20
$r->main" or "return ... unless $r->is_initial_req"? If not you may see=20
it spinning in the subprocess_env line if your $r->path_info is not=20
empty. The reason is a subrequest issued during $r->subprocess in void=20
context to compute the standard CGI variable $ENV{PATH_TRANSLATED}.=20
Apache does that by $r->lookup_uri($r->path_info). Assuming you don't=20
have a download, ARULink or WebApp directory in your DocumentRoot the=20
whole URI will be in $r->path_info as well. So, the subrequest will hit=20
the same location container an thus the authen handler. Just a guess.

On Tue 14 Oct 2008, Andr=E9 Warnier wrote:
> Now, below :
> =A0> SetHandler =A0 =A0 =A0 =A0 =A0 =A0 =A0perl-script
> is used when your purpose is to run a "traditional" cgi-bin script
> under mod_perl, not for embedded modules like your
> =A0> PerlResponseHandler =A0 =A0 ARULink::handler
> would indicate.
> I suggest you try replacing this first by
> SetHandler modperl

Sorry Andr=E9 but that is not entirely true. perl-script vs. modperl=20
simply means you want the more sophisticated response handler. It=20
affects only the response phase. Since the authen handler comes prior=20
to that it is irrelevant here. More sophisticated means you want %ENV=20
tied to $r->subprocess_env, tied *STDIN, *STDOUT, etc. The main reason=20
for me to avoid the perl-script handler is that it uses PerlOptions=20
+SetupEnv as default. That calls ap_add_cgi_vars() and that computes=20
$ENV{PATH_TRANSLATED} the IMHO most useless CGI variable. To do that it=20
issues a subrequest.

Torsten

=2D-
Need professional mod_perl support?
Just hire me: torsten.foertsch@gmx.net

Re: Apache2::Request in PerlInitHandler and PerlAuthenHandler

am 14.10.2008 13:18:55 von aw

Torsten Foertsch wrote:
> On Tue 14 Oct 2008, Shibi NS wrote:
>> And the ARULink::MetalinkAuth::handler is
>>
>> sub handler
>> {
>> my ($req) = @_;
>>
>> my $status;
>> my $username;
>> my $userid;
>> my $email;
>>
>> #
>> # Create a Session object.
>> #
>> my $req_params = $req->args;
>> my $cgi = CGI->new($req_params);
>> my $session = ARU::Session::get_cgi_session($cgi);
>> $req->subprocess_env;
>>
>> ....
>> }
>>
>> When my handler reaches line '(my $cgi = new CGI($params);)' the
>> application is spinning ,seems like $req->args is returning null and
>> application line number 354 of CGI which is $req->subprocess_env;
>>
>> Error from log file
>>
>> Warning:
>> Deep recursion on subroutine "CGI::new" at
>> /m/isd/pm/ARULink/MetalinkAuth.pm line 114.
>
> Don't know about CGI in this context but is there any chance to switch
> to Apache2::Request (libapreq2)?
>
> If you really see an empty $r->args at that stage while you are certain
> to have passed something then it is an error in mod_perl. Try to create
> a test case as short and simple as you can and file a bugreport.
>
> Try something like
>
> warn "params: ".$req->args;
>
> The warning will appear in the error_log.
>
> Can you please be more detailed about where it spins in CGI.pm? My
> version 3.29 looks like:
>
> 350 if ($MOD_PERL) {
> 351 if ($MOD_PERL == 1) {
> 352 $self->r(Apache->request) unless $self->r;
> 353 my $r = $self->r;
> 354 $r->register_cleanup(\&CGI::_reset_globals);
> 355 }
> 356 else {
> 357 # XXX: once we have the new API
> 358 # will do a real PerlOptions -SetupEnv check
> 359 $self->r(Apache2::RequestUtil->request) unless $self->r;
> 360 my $r = $self->r;
> 361 $r->subprocess_env unless exists $ENV{REQUEST_METHOD};
> 362 $r->pool->cleanup_register(\&CGI::_reset_globals);
> 363 }
> 364 undef $NPH;
> 365 }
>
> Line 354 is somewhere in the mp1 code path. The mp2 code path looks
> correct for me. Apache2::RequestUtil->request is set up in
> postreadrequest and again in headerparser if +GlobalRequest.
> cleanup_register() is also allowed here.
>
> Ah, does your code check for a subrequest? Something like "return ... if
> $r->main" or "return ... unless $r->is_initial_req"? If not you may see
> it spinning in the subprocess_env line if your $r->path_info is not
> empty. The reason is a subrequest issued during $r->subprocess in void
> context to compute the standard CGI variable $ENV{PATH_TRANSLATED}.
> Apache does that by $r->lookup_uri($r->path_info). Assuming you don't
> have a download, ARULink or WebApp directory in your DocumentRoot the
> whole URI will be in $r->path_info as well. So, the subrequest will hit
> the same location container an thus the authen handler. Just a guess.
>
> On Tue 14 Oct 2008, André Warnier wrote:
>> Now, below :
>> > SetHandler perl-script
>> is used when your purpose is to run a "traditional" cgi-bin script
>> under mod_perl, not for embedded modules like your
>> > PerlResponseHandler ARULink::handler
>> would indicate.
>> I suggest you try replacing this first by
>> SetHandler modperl
>
> Sorry André but that is not entirely true. perl-script vs. modperl
> simply means you want the more sophisticated response handler. It
> affects only the response phase. Since the authen handler comes prior
> to that it is irrelevant here. More sophisticated means you want %ENV
> tied to $r->subprocess_env, tied *STDIN, *STDOUT, etc. The main reason
> for me to avoid the perl-script handler is that it uses PerlOptions
> +SetupEnv as default. That calls ap_add_cgi_vars() and that computes
> $ENV{PATH_TRANSLATED} the IMHO most useless CGI variable. To do that it
> issues a subrequest.
>
I mentioned that mainly because I thought it might have something to do
with the convoluted gymnastics that CGI.pm does to try and figure out if
it is running under mod_perl, and under which version of it.

But anyway, there is no reason to use perl-script here rather than
mod_perl. It adds overhead, without bringing any benefit in this case.
I believe the problem might be more tied to the following lines :

>> my $req_params = $req->args;
>> my $cgi = CGI->new($req_params);

Is CGI really expecting in this case to receive the $r->args as argument
to new() ?
Looking at the code, it seems to expect various things in various
devious ways, but $r->args does not seem to be one of them.

There is by the way a certain lack of documentation about the behaviour
of CGI.pm under mod_perl. It is mentioned in some obscure place that
CGI is "aware" of mod_perl, but not much more.
Not in CGI.pm documentation at any rate.

Re: Apache2::Request in PerlInitHandler and PerlAuthenHandler

am 14.10.2008 19:22:58 von Perrin Harkins

On Tue, Oct 14, 2008 at 4:28 AM, Shibi NS wrote:
> my $req_params = $req->args;
> my $cgi = CGI->new($req_params);

There's no need to do that. Just call CGI->new(). And make sure you
have the latest version of CGI.pm from CPAN.

- Perrin

Re: Apache2::Request in PerlInitHandler and PerlAuthenHandler

am 15.10.2008 08:44:38 von Shibi NS

------=_Part_15852_25790266.1224053078422
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Sorry I forgot this info,

platform (Unix) : Red Hat Enterprise Linux AS release 3 (Taroon Update 8)
Apache/2.2.9
mod_perl/2.0.4
CGI.pm version 3.15

Shibi Ns

Perl/v5.8.8

On Tue, Oct 14, 2008 at 2:42 PM, Andr=E9 Warnier wrote:

> Hi.
>
> It usually helps for any kind of support issue, if you provide some
> information about where this is happening : what platform, which Apache
> version, which perl version, which mod_perl version, etc..
>
> Now, below :
> > SetHandler perl-script
> is used when your purpose is to run a "traditional" cgi-bin script under
> mod_perl, not for embedded modules like your
> > PerlResponseHandler ARULink::handler
> would indicate.
> I suggest you try replacing this first by
> SetHandler modperl
>
> For the same reason, the line
> > Options ExecCGI
> is not necessary, since you are not executing any cgi-bin scripts in that
> directory, only mod_perl handlers.
>
> Additionally, I am not quite sure of your line
> > my $cgi =3D CGI->new($req_params);
> I believe you should rather use
> > my $cgi =3D CGI->new($req);
> The CGI.pm module is smart enough, given the correct environment, to figu=
re
> out that it is running under mod_perl, and then use the request object
> ($req) as a base to build the CGI object.
>
> The above may well be why the CGI.pm library module is getting confused,
> and spinning. So try the changes first, and come back if it still has a
> problem.
>
>
>
> Shibi NS wrote:
>
>> I have following Location directive in my applications conf file
>>
>>
>> PerlInitHandler ARULink::setup_request
>> SetHandler perl-script
>> PerlResponseHandler ARULink::handler
>> PerlOptions +ParseHeaders +GlobalRequest
>> Options ExecCGI
>> AuthName Metalink
>> AuthType Basic
>> PerlAuthenHandler ARULink::MetalinkAuth
>> require valid-user
>> ErrorDocument 401 /handle_auth_failure
>>

>>
>>
>> And the ARULink::MetalinkAuth::handler is
>>
>> sub handler
>> {
>> my ($req) =3D @_;
>>
>> my $status;
>> my $username;
>> my $userid;
>> my $email;
>>
>> #
>> # Create a Session object.
>> #
>> my $req_params =3D $req->args;
>> my $cgi =3D CGI->new($req_params);
>> my $session =3D ARU::Session::get_cgi_session($cgi);
>> $req->subprocess_env;
>>
>> ....
>> }
>>
>> When my handler reaches line '(my $cgi =3D new CGI($params);)' the
>> application is spinning ,seems like $req->args is returning null and
>> application line number 354 of CGI which is $req->subprocess_env;
>>
>> Error from log file
>>
>> Warning:
>> Deep recursion on subroutine "CGI::new" at
>> /m/isd/pm/ARULink/MetalinkAuth.pm
>> line 114.
>>
>>
>> Line File Sub Called
>> Arg
>> WntA
>> ---- ---- ----------
>> ---
>> ----
>> 359 Debug.pm Debug::stack_trace =
Y
>> N
>> 114 MetalinkAuth.pm Debug::__ANON__ =
Y
>> N
>> 114 MetalinkAuth.pm CGI::new =
Y
>> N
>> 354 CGI.pm ARULink::MetalinkAuth::handler =
Y
>> N
>>
>> ..
>>
>> Any idea how can we get the $req->args which contains request informatio=
n
>> in PerlAuthenHandler or PerlInitHandler
>>
>> --Shibi Ns--
>>
>>
>


--=20
--Shibi Ns--

------=_Part_15852_25790266.1224053078422
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Sorry I forgot this info,

platform (Unix) : Red Hat=
Enterprise Linux AS release 3 (Taroon Update 8)
Apache/2.2.9
mod_pe=
rl/2.0.4
CGI.pm version 3.15

Shibi Ns

Perl/v5.8.8
>
On Tue, Oct 14, 2008 at 2:42 PM, Andr=E9 Warnier=
<&g=
t;
wrote:
1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex=
;">
Hi.



It usually helps for any kind of support issue, if you provide some informa=
tion about where this is happening : what platform, which Apache version, w=
hich perl version, which mod_perl version, etc..



Now, below :

> SetHandler              perl-script=


is used when your purpose is to run a "traditional" cgi-bin scrip=
t under mod_perl, not for embedded modules like your

> PerlResponseHandler     ARULink::handler

would indicate.

I suggest you try replacing this first by

SetHandler modperl



For the same reason, the line

> Options                 ExecCG=
I

is not necessary, since you are not executing any cgi-bin scripts in that d=
irectory, only mod_perl handlers.



Additionally, I am not quite sure of your line


>     my $cgi        =3D CGI->new($req_=
params);

I believe you should rather use

>     my $cgi        =3D CGI->new($req)=
;

The CGI.pm module is smart enough, given the correct environment, to figure=
out that it is running under mod_perl, and then use the request object ($r=
eq) as a base to build the CGI object.



The above may well be why the CGI.pm library module is getting confused, an=
d spinning.  So try the changes first, and come back if it still has a=
problem.






Shibi NS wrote:

204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
I have following Location directive in my applications conf file



<Location ~ ^/((download|ARULink|WebApp)/.*)?$>

PerlInitHandler         ARULink::setup_request

SetHandler              perl-script

PerlResponseHandler     ARULink::handler

PerlOptions             +ParseHeaders +Global=
Request

Options                 ExecCGI

AuthName                Metalink >
AuthType                Basic

PerlAuthenHandler       ARULink::MetalinkAuth

require                 valid-user<=
br>
ErrorDocument           401 /handle_auth_failure r>
</Location>





And the ARULink::MetalinkAuth::handler is



sub handler

{

   my ($req) =3D @_;



   my $status;

   my $username;

   my $userid;

   my $email;



   #

   # Create a Session object.

   #

   my $req_params =3D $req->args;

   my $cgi        =3D CGI->new($req_param=
s);

   my $session    =3D ARU::Session::get_cgi_session($c=
gi);

   $req->subprocess_env;



   ....

}



When my handler reaches line '(my $cgi    =3D new CGI($params=
);)' the

application is spinning ,seems like $req->args is returning null and

application line number 354 of CGI which is $req->subprocess_env;



Error from log file



Warning:

Deep recursion on subroutine "CGI::new" at /m/isd/pm/ARULink/Meta=
linkAuth.pm

line 114.





Line File                 Sub Calle=
d                     &nb=
sp;              Arg

WntA

---- ----                 ---------=
-                     &nb=
sp;              ---

----

 359 Debug.pm             Debug::stack_t=
race                     =
        Y

N

 114 MetalinkAuth.pm      Debug::__ANON__    =
                    &nbs=
p;      Y

N

 114 MetalinkAuth.pm      CGI::new      =
                    &nbs=
p;           Y

N

 354 CGI.pm               ARULink::=
MetalinkAuth::handler               &nbs=
p; Y

N



...



Any idea how can we get the $req->args which contains request informatio=
n

in PerlAuthenHandler  or PerlInitHandler



--Shibi Ns--









--
--Shibi Ns-=
-



------=_Part_15852_25790266.1224053078422--

Re: Apache2::Request in PerlInitHandler and PerlAuthenHandler

am 15.10.2008 22:34:24 von Perrin Harkins

On Wed, Oct 15, 2008 at 2:44 AM, Shibi NS wrote:
> CGI.pm version 3.15

Update.

- Perrin

Re: Apache2::Request in PerlInitHandler and PerlAuthenHandler

am 20.10.2008 18:57:06 von Shibi NS

------=_Part_178127_6863235.1224521826888
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

Thanks All for the valuable suggestions. my $cgi = CGI->new($req); fixed
my issue :)

On Thu, Oct 16, 2008 at 2:04 AM, Perrin Harkins wrote:

> On Wed, Oct 15, 2008 at 2:44 AM, Shibi NS wrote:
> > CGI.pm version 3.15
>
> Update.
>
> - Perrin
>



--
--Shibi Ns--

------=_Part_178127_6863235.1224521826888
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

Thanks All for the valuable suggestions.    my $cgi = CGI->new($req); fixed my issue :)

On Thu, Oct 16, 2008 at 2:04 AM, Perrin Harkins <> wrote:

On Wed, Oct 15, 2008 at 2:44 AM, Shibi NS <> wrote:


> CGI.pm version 3.15



Update.



- Perrin




--
--Shibi Ns--



------=_Part_178127_6863235.1224521826888--