From owner-hpff-distribute  Tue Jan  2 09:46:33 1996
Received: (from daemon@localhost) by cs.rice.edu (8.7.1/8.7.1) id JAA14588 for hpff-distribute-out; Tue, 2 Jan 1996 09:46:33 -0600 (CST)
Received: from fontainebleau.ensmp.fr (root@fontainebleau.ensmp.fr [192.54.148.100]) by cs.rice.edu (8.7.1/8.7.1) with SMTP id JAA14582 for <hpff-distribute@cs.rice.edu>; Tue, 2 Jan 1996 09:46:24 -0600 (CST)
Received: from cri.ensmp.fr (chailly.ensmp.fr) by fontainebleau.ensmp.fr with SMTP id AA07957
  (5.67a8/IDA-1.5 for <hpff-distribute@cs.rice.edu>); Tue, 2 Jan 1996 16:46:15 +0100
Received: from provins.caii by cri.ensmp.fr (4.1/SMI-4.0)
	id AA10263; Tue, 2 Jan 96 16:46:14 +0100
Date: Tue, 2 Jan 96 16:46:14 +0100
Message-Id: <9601021546.AA10263@cri.ensmp.fr>
Received: by provins.caii (4.1/SMI-4.1)
	id AA03312; Tue, 2 Jan 96 16:46:04 +0100
From: Fabien COELHO <coelho@chailly.ensmp.fr>
To: schreiber@hpl.hp.com
Subject: hpff-distribute: HPF reduce directive
Cc: hpff-distribute@cs.rice.edu
Sender: owner-hpff-distribute
Precedence: bulk

---------------------------------------------------------------------------
hpff-distribute@cs.rice.edu is a mailing list for discussion of data
distribution in High Performance Fortran.  Instructions for adding or
deleting yourself from this list appear at the bottom of this message.
---------------------------------------------------------------------------

Hi Rob,

I'm not sure you're in charge of the reduce directive, but anyway, I guess
someone on the "hpff-distribute" list is:

I just had a look the "reduce" directive proposal. I was wondering how
the compiler should guess at which level in a loop nest the reduction
must be performed. 

My point is that the way the "reduce" directive is placed in the loop nest
does not give this information to the compiler, thus some analysis will be
needed. This analysis could be avoided with some other syntax in the "new"
and "independent" spirit.


EXAMPLE:
--------

Here is an example to illustrate this point.  (This example is not
designed to be meaningful from the computation point of view, but to
provide a set of problems in the same loop nest.) The reduction on s1 must
be performed at the j level, the ones on s2 and s3 at the i level. The s3
reduction has two contributions from B and A. The reduction on s1 is
initialized with B. It is used for the p reduction.

      real A(n,n), B(n)
! there may be some external loop around this piece of code
      ...
      p = 1.
      s2 = 0.
      s3 = 0.
      do i=1, n
         B(i) = 2.*real(i-j)
         s1 = B(i)
         s3 = s3 + n*B(i)
         do j=1, n
            A(j,i) = 1./real(i+j)
            s1 = s1 + A(j,i)
            s2 = s2 + A(j,i)
            s3 = s3 + A(j,i)
         enddo
         p = p * s1
      enddo
      ...
! p, s2 and s3 might be used...


CURRENT "INTERNAL" REDUCE SYNTAX:
---------------------------------

With the current syntax, it's quite verbose and the compiler must decide
at with level the reduction must be performed. Another issue is whether
or not several contributions are allowed:

      p = 1.
      s2 = 0.
      s3 = 0.
chpf$ independent(i), new(s1, j)
      do i=1, n
         B(i) = 2.*real(i-j)
         s1 = B(i)                 ! initialization of s1
chpf$ reduce                       ! first contribution to s3...
         s3 = s3 + n*B(i)
chpf$ independent(j)
         do j=1, n
            A(j,i) = 1./real(i+j)
chpf$ reduce                       ! must guess that it is at the j level
                                   ! what are the needed analysis for this?
                                   ! should it trust the "new" outside?
                                   ! "see" that s1 is "simply" (as opposed
                                   ! to s3) assigned and used in the i loop?
                                   ! note that both s1 and s3 are read and
                                   ! written within the i loop.
            s1 = s1 + A(j,i)
chpf$ reduce                       ! i level (2 loops outward)
            s2 = s2 + A(j,i)
chpf$ reduce                       ! i level, second contribution to s3...
            s3 = s3 + A(j,i)
         enddo
chpf$ reduce                       ! i level
         p = p * s1
      enddo


"EXTERNAL" REDUCE SYNTAX:
-------------------------

I would rather suggest the less verbose (and nothing/few to guess):

      p = 1.
      s2 = 0.
      s3 = 0.
chpf$ independent(i), new(j,s1), reduce(s2,s3,p)
      do i=1, n
         B(i) = 2.*real(i-j)
         s1 = B(i)
         s3 = s3 + n*B(i)
chpf$ independent(j), reduce(s1[,s2,s3]) ! [] optional?
         do j=1, n
            A(j,i) = 1./real(i+j)
            s1 = s1 + A(j,i)
            s2 = s2 + A(j,i)
            s3 = s3 + A(j,i)
         enddo
         p = p * s1
      enddo

Apart from the reduced (!) verbosity, the very fact that the reduce
directive is attached to a loop gives the compiler a hint about the level
at which the reduction (=> [partial] synchronization) is to be performed. 

For checking purposes every scalar assigned in an independent loop should
appear in some "new" or "reduce" directive...  Also the multi-contribution
to a reduction does not require multiple annotations from the user (rising
the question of the semantics of the operation if some are forgotten...)

The compiler has to guess what are the reduction statement(s) for each
scalar, that is it has to find all the assignments to that scalar within
the loop nest.

The spirit of such an "external" reduce directive is quite different from
the "internal" one. It asserts at a higher level in the code a general
property about a loop nest and a scalar manipulated in this loop nest.
This is homogeneous with the existing "independent" and "new" directives,
ans thus improves the readability of the code.


NOTES:
------

As far as the forall is concerned, since it may not be independent, the
"external" reduce should exist without attachment:

chpf$ reduce(s)
      forall(i=2:n-1)
        s = s + a(i) 
        a(i) = a(i)+a(i-1)+a(i+1)
      end forall

Also it is not very clear to me what to do with reductions into arrays.
(I'm not sure from the minutes whether this is allowed or not)...

chpf$ independent(i,j), reduce(S(i)) ???
      do i=1, n
        do j=1, n
          S(i) = S(i) + A(k,j)
        enddo
      enddo

means that an "internal" directive might be of some help?


CONCLUSION:
-----------

To conclude, I suggest that another "external" (as opposed to the current
"internal") syntax for the reduce directive would (1) leave less work to
the compiler about "guessing" things, (2) be more high level and readable
(3) be less verbose.


Hope this help. Thanks for having read this mail. Comments are welcome.
Have a nice day,

Fabien.

--
Fabien COELHO __ http://www.cri.ensmp.fr/~coelho __ coelho@cri.ensmp.fr
  CRI, ENSMP, 35, rue Saint Honoré, 77305 Fontainebleau Cedex, France
     phone: 33 1 64 69 {voice: 48 52, fax: 47 09, standard: 47 08}
       ________  All opinions expressed here are mine  ________
---------------------------------------------------------------------------
To (un)subscribe to this list, send mail to
hpff-distribute-request@cs.rice.edu.
Leave the subject line blank, and in the body put the line
(un)subscribe <email-address>
---------------------------------------------------------------------------

From owner-hpff-distribute  Tue Jan  2 10:57:27 1996
Received: (from daemon@localhost) by cs.rice.edu (8.7.1/8.7.1) id KAA16230 for hpff-distribute-out; Tue, 2 Jan 1996 10:57:27 -0600 (CST)
Received: from fontainebleau.ensmp.fr (root@fontainebleau.ensmp.fr [192.54.148.100]) by cs.rice.edu (8.7.1/8.7.1) with SMTP id KAA16215; Tue, 2 Jan 1996 10:57:03 -0600 (CST)
Received: from cri.ensmp.fr (chailly.ensmp.fr) by fontainebleau.ensmp.fr with SMTP id AA08477
  (5.67a8/IDA-1.5); Tue, 2 Jan 1996 17:57:00 +0100
Received: from provins.caii by cri.ensmp.fr (4.1/SMI-4.0)
	id AA12171; Tue, 2 Jan 96 17:56:59 +0100
Date: Tue, 2 Jan 96 17:56:59 +0100
Message-Id: <9601021656.AA12171@cri.ensmp.fr>
Received: by provins.caii (4.1/SMI-4.1)
	id AA03405; Tue, 2 Jan 96 17:56:58 +0100
From: Fabien COELHO <coelho@chailly.ensmp.fr>
To: chk@cs.rice.edu
Cc: hpff-distribute@cs.rice.edu
In-Reply-To: message from Fabien COELHO on Tue, 2 Jan 96 16:46:14 +0100
Subject: hpff-distribute: not atached "new" directive
Sender: owner-hpff-distribute
Precedence: bulk

---------------------------------------------------------------------------
hpff-distribute@cs.rice.edu is a mailing list for discussion of data
distribution in High Performance Fortran.  Instructions for adding or
deleting yourself from this list appear at the bottom of this message.
---------------------------------------------------------------------------

Hi Chuck,

> chpf$ reduce(s)
>       forall(i=2:n-1)
>         s = s + a(i) 
>         a(i) = a(i)+a(i-1)+a(i+1)
>       end forall

The example I just posted on the net reminds me my (really real)
application with "private" scalars that required a "new" clause outside 
a loop. Forall constructs may also use scalars to avoid redundant
computations: 

chpf$ new(x) ! apply on the next loop, here the forall...
      forall(i=2:n)
        x = a(i-1)+2*a(i)+a(i+1) ! x used to store an intermediate value.
        b(i) = f1(x)             ! some pure function.
        a(i) = f2(x)             ! idem.
      end forall

Here the loop is NOT independent and x must be private to each iteration
for parallelism. I guess the compiler must expand the scalar into an array
for such a loop. I think that this kind of loop should be allowed by HPF,
and that it is not with the current definition of forall/new.
The other way around is to assume that a scalar in a forall *must* be
private (?) or to perform some analysis to prove it, but I understood that
one of the goal of the HPF Forum is that no advanced analysis technique is
needed by compilers for handling HPF. 

Hope this help. Have a nice day,

Fabien.

--
Fabien COELHO __ http://www.cri.ensmp.fr/~coelho __ coelho@cri.ensmp.fr
  CRI, ENSMP, 35, rue Saint Honoré, 77305 Fontainebleau Cedex, France
     phone: 33 1 64 69 {voice: 48 52, fax: 47 09, standard: 47 08}
       ________  All opinions expressed here are mine  ________
---------------------------------------------------------------------------
To (un)subscribe to this list, send mail to
hpff-distribute-request@cs.rice.edu.
Leave the subject line blank, and in the body put the line
(un)subscribe <email-address>
---------------------------------------------------------------------------

From owner-hpff-distribute  Tue Jan  2 11:18:15 1996
Received: (from daemon@localhost) by cs.rice.edu (8.7.1/8.7.1) id LAA16972 for hpff-distribute-out; Tue, 2 Jan 1996 11:18:15 -0600 (CST)
Received: from hplms26.hpl.hp.com (hplms26.hpl.hp.com [15.255.168.31]) by cs.rice.edu (8.7.1/8.7.1) with ESMTP id LAA16967 for <hpff-distribute@cs.rice.edu>; Tue, 2 Jan 1996 11:18:12 -0600 (CST)
Received: from hplpp3.hpl.hp.com by hplms26.hpl.hp.com with ESMTP
	($Revision: 1.36.108.11 $/15.5+ECS 3.3+HPL1.1S) id AA230183003; Tue, 2 Jan 1996 09:16:43 -0800
Received: by hplpp3.hpl.hp.com
	(1.37.109.14/15.5+ECS 3.3+HPL1.1) id AA197913000; Tue, 2 Jan 1996 09:16:40 -0800
Date: Tue, 2 Jan 1996 09:16:40 -0800
From: Rob Schreiber <schreibr@hplpp3.hpl.hp.com>
Message-Id: <199601021716.AA197913000@hplpp3.hpl.hp.com>
To: coelho@chailly.ensmp.fr, schreiber@hplms26.hpl.hp.com
Subject: hpff-distribute: Re:  HPF reduce directive
Cc: hpff-distribute@cs.rice.edu
Sender: owner-hpff-distribute
Precedence: bulk

---------------------------------------------------------------------------
hpff-distribute@cs.rice.edu is a mailing list for discussion of data
distribution in High Performance Fortran.  Instructions for adding or
deleting yourself from this list appear at the bottom of this message.
---------------------------------------------------------------------------

Dear Fabien,

I know this is a subtle issue.   I thought we had unabiguously defined the
answer to the "shich loop" question as the outermost DO loop that:

i)  Is independent

ii)  Does not have a NEW clause for the reduction variable, and

iii)  Does not *contain* in its range an independent DO loop with a NEW
      clause for the reduction variable.

Also, the reduction statement must be in the lexical range of the DO loop.
Thus, we have addressed the issues of whether more than one reduction statment
may occur (there is no restriction on the number or the place)
and which loops are the scope of the reduction.   Nevertheless, your
points about economy of expression are very well taken.    We should discuss
this alternative.

Rob


	From coelho@chailly.ensmp.fr Tue Jan  2 07:49 PST 1996

	Hi Rob,
	
	I'm not sure you're in charge of the reduce directive, but anyway, I guess
	someone on the "hpff-distribute" list is:
	
	I just had a look the "reduce" directive proposal. I was wondering how
	the compiler should guess at which level in a loop nest the reduction
	must be performed. 
	
	My point is that the way the "reduce" directive is placed in the loop nest
	does not give this information to the compiler, thus some analysis will be
	needed. This analysis could be avoided with some other syntax in the "new"
	and "independent" spirit.
	
	
	EXAMPLE:
	--------
	
	Here is an example to illustrate this point.  (This example is not
	designed to be meaningful from the computation point of view, but to
	provide a set of problems in the same loop nest.) The reduction on s1 must
	be performed at the j level, the ones on s2 and s3 at the i level. The s3
	reduction has two contributions from B and A. The reduction on s1 is
	initialized with B. It is used for the p reduction.
	
	      real A(n,n), B(n)
	! there may be some external loop around this piece of code
	      ...
	      p = 1.
	      s2 = 0.
	      s3 = 0.
	      do i=1, n
	         B(i) = 2.*real(i-j)
	         s1 = B(i)
	         s3 = s3 + n*B(i)
	         do j=1, n
	            A(j,i) = 1./real(i+j)
	            s1 = s1 + A(j,i)
	            s2 = s2 + A(j,i)
	            s3 = s3 + A(j,i)
	         enddo
	         p = p * s1
	      enddo
	      ...
	! p, s2 and s3 might be used...
	
	
	CURRENT "INTERNAL" REDUCE SYNTAX:
	---------------------------------
	
	With the current syntax, it's quite verbose and the compiler must decide
	at with level the reduction must be performed. Another issue is whether
	or not several contributions are allowed:
	
	      p = 1.
	      s2 = 0.
	      s3 = 0.
	chpf$ independent(i), new(s1, j)
	      do i=1, n
	         B(i) = 2.*real(i-j)
	         s1 = B(i)                 ! initialization of s1
	chpf$ reduce                       ! first contribution to s3...
	         s3 = s3 + n*B(i)
	chpf$ independent(j)
	         do j=1, n
	            A(j,i) = 1./real(i+j)
	chpf$ reduce                       ! must guess that it is at the j level
	                                   ! what are the needed analysis for this?
	                                   ! should it trust the "new" outside?
	                                   ! "see" that s1 is "simply" (as opposed
	                                   ! to s3) assigned and used in the i loop?
	                                   ! note that both s1 and s3 are read and
	                                   ! written within the i loop.
	            s1 = s1 + A(j,i)
	chpf$ reduce                       ! i level (2 loops outward)
	            s2 = s2 + A(j,i)
	chpf$ reduce                       ! i level, second contribution to s3...
	            s3 = s3 + A(j,i)
	         enddo
	chpf$ reduce                       ! i level
	         p = p * s1
	      enddo
	
	
	"EXTERNAL" REDUCE SYNTAX:
	-------------------------
	
	I would rather suggest the less verbose (and nothing/few to guess):
	
	      p = 1.
	      s2 = 0.
	      s3 = 0.
	chpf$ independent(i), new(j,s1), reduce(s2,s3,p)
	      do i=1, n
	         B(i) = 2.*real(i-j)
	         s1 = B(i)
	         s3 = s3 + n*B(i)
	chpf$ independent(j), reduce(s1[,s2,s3]) ! [] optional?
	         do j=1, n
	            A(j,i) = 1./real(i+j)
	            s1 = s1 + A(j,i)
	            s2 = s2 + A(j,i)
	            s3 = s3 + A(j,i)
	         enddo
	         p = p * s1
	      enddo
	
	Apart from the reduced (!) verbosity, the very fact that the reduce
	directive is attached to a loop gives the compiler a hint about the level
	at which the reduction (=> [partial] synchronization) is to be performed. 
	
	For checking purposes every scalar assigned in an independent loop should
	appear in some "new" or "reduce" directive...  Also the multi-contribution
	to a reduction does not require multiple annotations from the user (rising
	the question of the semantics of the operation if some are forgotten...)
	
	The compiler has to guess what are the reduction statement(s) for each
	scalar, that is it has to find all the assignments to that scalar within
	the loop nest.
	
	The spirit of such an "external" reduce directive is quite different from
	the "internal" one. It asserts at a higher level in the code a general
	property about a loop nest and a scalar manipulated in this loop nest.
	This is homogeneous with the existing "independent" and "new" directives,
	ans thus improves the readability of the code.
	
	
	NOTES:
	------
	
	As far as the forall is concerned, since it may not be independent, the
	"external" reduce should exist without attachment:
	
	chpf$ reduce(s)
	      forall(i=2:n-1)
	        s = s + a(i) 
	        a(i) = a(i)+a(i-1)+a(i+1)
	      end forall
	
	Also it is not very clear to me what to do with reductions into arrays.
	(I'm not sure from the minutes whether this is allowed or not)...
	
	chpf$ independent(i,j), reduce(S(i)) ???
	      do i=1, n
	        do j=1, n
	          S(i) = S(i) + A(k,j)
	        enddo
	      enddo
	
	means that an "internal" directive might be of some help?
No, I think one could require that ALL of S be treated as a redction variable;
so the list in 

     reduce(something-list)

would be a list of names, not subscripted instances of names (whatever the
F90 syntactic class is).

	
	
	CONCLUSION:
	-----------
	
	To conclude, I suggest that another "external" (as opposed to the current
	"internal") syntax for the reduce directive would (1) leave less work to
	the compiler about "guessing" things, (2) be more high level and readable
	(3) be less verbose.
	
	
	Hope this help. Thanks for having read this mail. Comments are welcome.
	Have a nice day,
	
	Fabien.
---------------------------------------------------------------------------
To (un)subscribe to this list, send mail to
hpff-distribute-request@cs.rice.edu.
Leave the subject line blank, and in the body put the line
(un)subscribe <email-address>
---------------------------------------------------------------------------

From owner-hpff-distribute  Tue Jan  2 12:44:03 1996
Received: (from daemon@localhost) by cs.rice.edu (8.7.1/8.7.1) id MAA20317 for hpff-distribute-out; Tue, 2 Jan 1996 12:44:03 -0600 (CST)
Received: from fontainebleau.ensmp.fr (root@fontainebleau.ensmp.fr [192.54.148.100]) by cs.rice.edu (8.7.1/8.7.1) with SMTP id MAA20300; Tue, 2 Jan 1996 12:43:54 -0600 (CST)
Received: from cri.ensmp.fr (chailly.ensmp.fr) by fontainebleau.ensmp.fr with SMTP id AA09225
  (5.67a8/IDA-1.5); Tue, 2 Jan 1996 19:43:43 +0100
Received: from provins.caii by cri.ensmp.fr (4.1/SMI-4.0)
	id AA13899; Tue, 2 Jan 96 19:43:42 +0100
Date: Tue, 2 Jan 96 19:43:42 +0100
Message-Id: <9601021843.AA13899@cri.ensmp.fr>
Received: by provins.caii (4.1/SMI-4.1)
	id AA03502; Tue, 2 Jan 96 19:43:41 +0100
From: Fabien COELHO <coelho@chailly.ensmp.fr>
To: chk@cs.rice.edu
In-Reply-To: <v01530509ad0f1c8a776c@[128.42.1.213]> (chk@cs.rice.edu)
Subject: hpff-distribute: Re: HPF reduce directive
Cc: hpff-distribute@cs.rice.edu
Sender: owner-hpff-distribute
Precedence: bulk

---------------------------------------------------------------------------
hpff-distribute@cs.rice.edu is a mailing list for discussion of data
distribution in High Performance Fortran.  Instructions for adding or
deleting yourself from this list appear at the bottom of this message.
---------------------------------------------------------------------------

Hi Chuck,

> Actually, the mailing list that is discussing REDUCE is hpff-task.

Sorry for the mis-posting, and thanks for the pointer.


About independent:

> I'll comment that I generally like the "external" syntax, modulo a
> couple syntax nits (for example, INDEPEDENT does not name the loop index,

Oops... Your're right (for sure:-). 

I noticed the syntax from early versions of the HPF document (0.2 for
instance) and never notice ever since that it was dropped out!

I parse it with my compiler (as well as the implicite one). I found it
quite convenient for loop nests (the inner loop indexes being implicitely
private...) 

chpf$ independent(i,j)     
      do i = ...
         do j = ...
            ...
         enddo
      enddo

instead of

chpf$ independent, new(j)  
      do i = ...
chpf$    independent
         do j = ...
            ...
         enddo
      enddo

But this is just a matter of syntactic sugar. And verbosity.

> and doesn't apply to nested loops.)

Do you mean that my inner loop cannot be tagged as independent?
Because it is not perfectly nested?

I have not seen such a restriction in HPF 1.0 (or it is not listed in the
constraint list?). I cannot see any rational for it. The compiler is not
required to execute the loop in parallel, it's just a matter of asserting
some semantical property of a piece of code, in my understanding.

BTW, Happy new year!

Fabien.

--
Fabien COELHO __ http://www.cri.ensmp.fr/~coelho __ coelho@cri.ensmp.fr
  CRI, ENSMP, 35, rue Saint Honoré, 77305 Fontainebleau Cedex, France
     phone: 33 1 64 69 {voice: 48 52, fax: 47 09, standard: 47 08}
       ________  All opinions expressed here are mine  ________
---------------------------------------------------------------------------
To (un)subscribe to this list, send mail to
hpff-distribute-request@cs.rice.edu.
Leave the subject line blank, and in the body put the line
(un)subscribe <email-address>
---------------------------------------------------------------------------

From owner-hpff-distribute  Wed Jan  3 10:12:59 1996
Received: (from daemon@localhost) by cs.rice.edu (8.7.1/8.7.1) id KAA12195 for hpff-distribute-out; Wed, 3 Jan 1996 10:12:59 -0600 (CST)
Date: Wed, 3 Jan 1996 10:12:59 -0600 (CST)
Message-Id: <199601031612.KAA12195@cs.rice.edu>
From: Rob Schreiber <schreibr@hplpp3.hpl.hp.com>
Subject: hpff-distribute: New inquiry procedures
Sender: owner-hpff-distribute
Precedence: bulk

---------------------------------------------------------------------------
hpff-distribute@cs.rice.edu is a mailing list for discussion of data
distribution in High Performance Fortran.  Instructions for adding or
deleting yourself from this list appear at the bottom of this message.
---------------------------------------------------------------------------


Draft of mapping inquiry procedures revised to allow new (general block, indirect, and
ONTO sections of processors arrangements) mapping possibilities.

Rob

%!PS-Adobe-2.0
%%Creator: dvipsk 5.58a Copyright 1986, 1994 Radical Eye Software
%%Title: temp.dvi
%%Pages: 12
%%PageOrder: Ascend
%%BoundingBox: 0 0 612 792
%%EndComments
%DVIPSCommandLine: dvips temp -o temp.ps
%DVIPSParameters: dpi=600, compressed, comments removed
%DVIPSSource:  TeX output 1996.01.02:1513
%%BeginProcSet: texc.pro
/TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N
/X{S N}B /TR{translate}N /isls false N /vsize 11 72 mul N /hsize 8.5 72
mul N /landplus90{false}def /@rigin{isls{[0 landplus90{1 -1}{-1 1}
ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale
isls{landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div
hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul
TR[matrix currentmatrix{dup dup round sub abs 0.00001 lt{round}if}
forall round exch round exch]setmatrix}N /@landscape{/isls true N}B
/@manualfeed{statusdict /manualfeed true put}B /@copies{/#copies X}B
/FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{
/nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N
string /base X array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N
end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{
/sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0]
N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data dup
length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{
128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub
get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data
dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N
/rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup
/base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx
0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff
setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff
.1 sub]/id ch-image N /rw ch-width 7 add 8 idiv string N /rc 0 N /gp 0 N
/cp 0 N{rc 0 ne{rc 1 sub /rc X rw}{G}ifelse}imagemask restore}B /G{{id
gp get /gp gp 1 add N dup 18 mod S 18 idiv pl S get exec}loop}B /adv{cp
add /cp X}B /chg{rw cp id gp 4 index getinterval putinterval dup gp add
/gp X adv}B /nd{/cp 0 N rw exit}B /lsh{rw cp 2 copy get dup 0 eq{pop 1}{
dup 255 eq{pop 254}{dup dup add 255 and S 1 and or}ifelse}ifelse put 1
adv}B /rsh{rw cp 2 copy get dup 0 eq{pop 128}{dup 255 eq{pop 127}{dup 2
idiv S 128 and or}ifelse}ifelse put 1 adv}B /clr{rw cp 2 index string
putinterval adv}B /set{rw cp fillstr 0 4 index getinterval putinterval
adv}B /fillstr 18 string 0 1 17{2 copy 255 put pop}for N /pl[{adv 1 chg}
{adv 1 chg nd}{1 add chg}{1 add chg nd}{adv lsh}{adv lsh nd}{adv rsh}{
adv rsh nd}{1 add adv}{/rc X nd}{1 add set}{1 add clr}{adv 2 chg}{adv 2
chg nd}{pop nd}]dup{bind pop}forall N /D{/cc X dup type /stringtype ne{]
}if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup
length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{
cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin
0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul
add .99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore userdict
/eop-hook known{eop-hook}if showpage}N /@start{userdict /start-hook
known{start-hook}if pop /VResolution X /Resolution X 1000 div /DVImag X
/IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for
65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0
0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V
{}B /RV statusdict begin /product where{pop product dup length 7 ge{0 7
getinterval dup(Display)eq exch 0 4 getinterval(NeXT)eq or}{pop false}
ifelse}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale rulex ruley false
RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR rulex ruley scale 1 1
false RMat{BDot}imagemask grestore}}ifelse B /QV{gsave newpath transform
round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg
rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail
{dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B /c{-4 M}
B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{
4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{
p 1 w}B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p
a}B /bos{/SS save N}B /eos{SS restore}B end
%%EndProcSet
%%BeginProcSet: special.pro
TeXDict begin /SDict 200 dict N SDict begin /@SpecialDefaults{/hs 612 N
/vs 792 N /ho 0 N /vo 0 N /hsc 1 N /vsc 1 N /ang 0 N /CLIP 0 N /rwiSeen
false N /rhiSeen false N /letter{}N /note{}N /a4{}N /legal{}N}B
/@scaleunit 100 N /@hscale{@scaleunit div /hsc X}B /@vscale{@scaleunit
div /vsc X}B /@hsize{/hs X /CLIP 1 N}B /@vsize{/vs X /CLIP 1 N}B /@clip{
/CLIP 2 N}B /@hoffset{/ho X}B /@voffset{/vo X}B /@angle{/ang X}B /@rwi{
10 div /rwi X /rwiSeen true N}B /@rhi{10 div /rhi X /rhiSeen true N}B
/@llx{/llx X}B /@lly{/lly X}B /@urx{/urx X}B /@ury{/ury X}B /magscale
true def end /@MacSetUp{userdict /md known{userdict /md get type
/dicttype eq{userdict begin md length 10 add md maxlength ge{/md md dup
length 20 add dict copy def}if end md begin /letter{}N /note{}N /legal{}
N /od{txpose 1 0 mtx defaultmatrix dtransform S atan/pa X newpath
clippath mark{transform{itransform moveto}}{transform{itransform lineto}
}{6 -2 roll transform 6 -2 roll transform 6 -2 roll transform{
itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll curveto}}{{
closepath}}pathforall newpath counttomark array astore /gc xdf pop ct 39
0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}if}N
/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 -1
scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 get
ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip
not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub neg 0
TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{noflips{TR
pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop 90 rotate 1
-1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg
TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr 1 get neg
sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr 2 get ppr
0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 -1 roll add
2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S TR}if}N /cp
{pop pop showpage pm restore}N end}if}if}N /normalscale{Resolution 72
div VResolution 72 div neg scale magscale{DVImag dup scale}if 0 setgray}
N /psfts{S 65781.76 div N}N /startTexFig{/psf$SavedState save N userdict
maxlength dict begin /magscale true def normalscale currentpoint TR
/psf$ury psfts /psf$urx psfts /psf$lly psfts /psf$llx psfts /psf$y psfts
/psf$x psfts currentpoint /psf$cy X /psf$cx X /psf$sx psf$x psf$urx
psf$llx sub div N /psf$sy psf$y psf$ury psf$lly sub div N psf$sx psf$sy
scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub TR
/showpage{}N /erasepage{}N /copypage{}N /p 3 def @MacSetUp}N /doclip{
psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll newpath 4 copy 4 2
roll moveto 6 -1 roll S lineto S lineto S lineto closepath clip newpath
moveto}N /endTexFig{end psf$SavedState restore}N /@beginspecial{SDict
begin /SpecialSave save N gsave normalscale currentpoint TR
@SpecialDefaults count /ocount X /dcount countdictstack N}N /@setspecial
{CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto
closepath clip}if ho vo TR hsc vsc scale ang rotate rwiSeen{rwi urx llx
sub div rhiSeen{rhi ury lly sub div}{dup}ifelse scale llx neg lly neg TR
}{rhiSeen{rhi ury lly sub div dup scale llx neg lly neg TR}if}ifelse
CLIP 2 eq{newpath llx lly moveto urx lly lineto urx ury lineto llx ury
lineto closepath clip}if /showpage{}N /erasepage{}N /copypage{}N newpath
}N /@endspecial{count ocount sub{pop}repeat countdictstack dcount sub{
end}repeat grestore SpecialSave restore end}N /@defspecial{SDict begin}
N /@fedspecial{end}B /li{lineto}B /rl{rlineto}B /rc{rcurveto}B /np{
/SaveX currentpoint /SaveY X N 1 setlinecap newpath}N /st{stroke SaveX
SaveY moveto}N /fil{fill SaveX SaveY moveto}N /ellipse{/endangle X
/startangle X /yrad X /xrad X /savematrix matrix currentmatrix N TR xrad
yrad scale 0 0 1 startangle endangle arc savematrix setmatrix}N end
%%EndProcSet
TeXDict begin 40258431 52099146 1000 600 600 (temp.dvi)
@start /Fa 43 118 df<121C127FEAFF80A213C0A3127F121C1200A412011380A21203
13005A1206120E5A5A5A12600A1979B917>39 D<121C127FEAFF80A213C0A3127F121C12
00A412011380A2120313005A1206120E5A5A5A12600A19798817>44
D<B512FCA516057F941C>I<150C151E153EA2153C157CA2157815F8A215F01401A215E0
1403A215C01407A21580140FA215005CA2141E143EA2143C147CA2147814F8A25C1301A2
5C1303A2495AA25C130FA291C7FC5BA2131E133EA2133C137CA2137813F8A25B1201A25B
1203A25B1207A25B120FA290C8FC5AA2121E123EA2123C127CA2127812F8A25A12601F53
7BBD2A>47 D<EB03F8EB1FFF90387E0FC09038F803E03901E000F0484813780007147C48
487FA248C77EA2481580A3007EEC0FC0A600FE15E0B3007E15C0A4007F141F6C1580A36C
15006D5B000F143EA26C6C5B6C6C5B6C6C485A6C6C485A90387E0FC0D91FFFC7FCEB03F8
233A7DB72A>I<EB01C013031307131F13FFB5FCA2131F1200B3B3A8497E007FB512F0A3
1C3879B72A>I<EB0FF0EB7FFE48B57E3903E03FE0390F000FF0000E6D7E486D7E486D7E
123000706D7E126012FCB4EC7F807FA56CC7FC121CC8FCEDFF00A34A5A5D14035D4A5A5D
140F4A5A4A5A92C7FC147C5C495A495A495A495A91C8FC011EEB01805B5B491303484814
00485A485A000EC75A000FB6FC5A5A485CB6FCA321387CB72A>I<EB07F8EB3FFF4913C0
3901F80FF03903C007F848486C7E380E0001000F80381FE0006D7FA56C5A6C5AC85A1401
A25D4A5AA24A5A5DEC0F80027EC7FCEB1FFCECFF809038000FE06E7EEC01FC816E7EED7F
80A216C0A2153F16E0A2121EEA7F80487EA416C049137F007F1580007EC7FC0070ECFF00
6C495A121E390F8003F83907F00FF00001B512C06C6C90C7FCEB0FF8233A7DB72A>I<15
38A2157815F8A2140114031407A2140F141F141B14331473146314C313011483EB030313
071306130C131C131813301370136013C01201EA038013005A120E120C5A123812305A12
E0B712F8A3C73803F800AB4A7E0103B512F8A325397EB82A>I<0006140CD80780133C90
38F003F890B5FC5D5D158092C7FC14FC38067FE090C9FCABEB07F8EB3FFE9038780F8039
07E007E090388003F0496C7E12066E7EC87EA28181A21680A4123E127F487EA490C71300
485C12E000605C12700030495A00385C6C1303001E495A6C6C485A3907E03F800001B5C7
FC38007FFCEB1FE0213A7CB72A>I<EC3FC0903801FFF0010713FC90380FE03E90383F80
0790387E001F49EB3F804848137F485AA2485A000FEC3F0049131E001F91C7FCA2485AA3
127F90C9FCEB01FC903807FF8039FF1E07E090383801F0496C7E01607F01E0137E497FA2
49148016C0151FA290C713E0A57EA56C7E16C0A2121FED3F807F000F15006C6C5B15FE6C
6C5B6C6C485A3900FE07F090383FFFC06D90C7FCEB03FC233A7DB72A>I<EB03F8EB1FFF
017F13C09038FC07F03901E001F848486C7E4848137C90C77E48141E000E141F001E80A3
121FA27F5D01E0131E6C6C133E01FC133C6D5B6C6C6C5AECC1E06CEBF3C06C01FFC7FC6C
5BEB3FFF6D13C081017F13F801F07F3903E07FFE3907801FFF48486C1380481303003E6D
13C0003CEB007F007C143F0078EC0FE000F814075A1503A21501A36C15C012781503007C
15806CEC07006C5C6C6C131ED807E0137C3903F803F0C6B55A013F1380D907FCC7FC233A
7DB72A>56 D<1538A3157CA315FEA34A7EA34A6C7EA202077FEC063FA2020E7FEC0C1FA2
021C7FEC180FA202387FEC3007A202707FEC6003A202C07F1501A2D901807F81A249C77F
167FA20106810107B6FCA24981010CC7121FA2496E7EA3496E7EA3496E7EA213E0707E12
01486C81D80FFC02071380B56C90B512FEA3373C7DBB3E>65 D<B712E016FC16FF000190
3980007FC06C90C7EA1FE0707E707E707EA2707EA283A75F16035F4C5A4C5A4C5A4C5AEE
FF8091B500FCC7FCA291C7EA7F80EE1FE0EE07F0707E707E83707EA21880177F18C0A718
8017FFA24C13005F16034C5AEE1FF8486DEB7FF0B812C094C7FC16F832397DB83B>I<91
3A01FF800180020FEBE003027F13F8903A01FF807E07903A03FC000F0FD90FF0EB039F49
48EB01DFD93F80EB00FF49C8127F01FE153F12014848151F4848150FA248481507A2485A
1703123F5B007F1601A35B00FF93C7FCAD127F6DED0180A3123F7F001F160318006C7E5F
6C7E17066C6C150E6C6C5D00001618017F15386D6C5CD91FE05C6D6CEB03C0D903FCEB0F
80902701FF803FC7FC9039007FFFFC020F13F002011380313D7BBA3C>I<B712C016F816
FE000190398001FF806C90C7EA3FE0EE0FF0EE03F8707E707E177FA2EF3F8018C0171F18
E0170F18F0A3EF07F8A418FCAC18F8A4EF0FF0A218E0A2171F18C0EF3F80A2EF7F0017FE
4C5A4C5AEE0FF0EE3FE0486DEBFF80B8C7FC16F816C036397DB83F>I<B812FCA3000190
3880000F6C90C71201EE007E173E171E170EA31706A317078316C0A394C7FCA31501A215
03150F91B5FCA3EC000F15031501A21500A21860A318E093C712C0A41701A3EF0380A217
07A2170F173F177F486D903807FF00B9FCA333397DB839>I<B812F8A30001903880001F
6C90C71201EE00FC177C173C171CA2170CA4170E1706A2ED0180A21700A41503A2150715
1F91B5FCA3EC001F15071503A21501A692C8FCAD4813C0B612C0A32F397DB836>I<DBFF
8013C0020FEBF001023F13FC9139FF803F03903A03FC000787D90FF0EB03CF4948EB00EF
4948147F4948143F49C8121F485A4848150F48481507A248481503A2485A1701123F5B00
7F1600A448481600AB93B6FCA26C7E9338007FE0EF3FC0A2123F7F121FA26C7EA26C7EA2
6C7E6C7E6C6C157F6D7E6D6C14FF6D6C14EFD90FF8EB03C7D903FEEB0783903A00FFC03F
0191393FFFFC00020F01F0130002001380383D7CBA41>I<B648B512FEA3000190268000
0313006C90C76C5AB3A491B6FCA391C71201B3A6486D497EB648B512FEA337397DB83E>
I<B612C0A3C6EBC0006D5AB3B3AD497EB612C0A31A397EB81E>I<B649B5FCA300010180
9038007FF06C90C8EA3F80053EC7FC173C17385F5F4C5A4C5A4CC8FC160E5E5E5E5E4B5A
ED0780030EC9FC5D153E157E15FF5C4A7F4A6C7E140E4A6C7E4A6C7E14704A6C7E4A6C7E
14804A6C7E6F7EA26F7F707EA2707E707EA2707EA2707E707EA2707E707F8484486D497F
B6011FEBFF80A339397DB841>75 D<B612E0A3000101C0C8FC6C90C9FCB3AD1718A51738
1730A31770A317F0A216011603160FEE1FE0486D13FFB8FCA32D397DB834>I<B5933807
FFF86E5DA20001F0FC002600DFC0ED1BF8A2D9CFE01533A3D9C7F01563A3D9C3F815C3A2
D9C1FCEC0183A3D9C0FEEC0303A2027F1406A36E6C130CA36E6C1318A26E6C1330A36E6C
1360A26E6C13C0A3913901FC0180A3913900FE0300A2ED7F06A3ED3F8CA2ED1FD8A3ED0F
F0A3486C6D5A487ED80FFC6D48497EB500C00203B512F8A2ED018045397DB84C>I<B591
3807FFFE8080C69238007FE06EEC1F80D9DFF0EC0F001706EBCFF8EBC7FCA2EBC3FEEBC1
FFA201C07F6E7EA26E7E6E7E81140F6E7E8114036E7E168080ED7FC016E0153FED1FF0ED
0FF8A2ED07FCED03FEA2ED01FF6F1386A2EE7FC6EE3FE6A2EE1FF6EE0FFEA216071603A2
16011600A2177E486C153E487ED80FFC151EB500C0140EA2170637397DB83E>I<EC03FF
021F13E09138FE01FC903901F8007ED907E0EB1F8049486D7ED93F80EB07F049C76C7E01
FE6E7E48486E7E49157E0003167F4848ED3F80A24848ED1FC0A2001F17E049150F003F17
F0A3007F17F8491507A300FF17FCAC007F17F86D150FA3003F17F0A26C6CED1FE0A36C6C
ED3FC0000717806D157F000317006C6C15FEA26C6C4A5A017F4A5A6D6C495A6D6C495AD9
07E0EB1F80D903F8017FC7FC903900FE01FC91381FFFE0020390C8FC363D7BBA41>I<B7
12C016F816FE000190398001FF806C90C7EA3FC0EE0FE0EE07F0EE03F817FC17FE1601A2
17FFA717FEA2EE03FCA2EE07F817F0EE0FE0EE3FC0923801FF0091B512FC16F091C9FCB3
A5487FB6FCA330397DB839>I<B612FEEDFFE016F8000190388007FE6C90C76C7EEE3FC0
707E707E707EA2707EA283A65FA24C5AA24C5A4C5AEE3F8004FFC8FCED07FC91B512E05E
9138000FF0ED03F8ED00FE82707E707EA2161F83A583A6F00180A217F8160F1803486D01
071400B66D6C5A04011306933800FE0ECAEA3FFCEF07F0393B7DB83D>82
D<D90FF813C090383FFE0190B512813903F807E33907E000F74848137F4848133F48C712
1F003E140F007E1407A2007C140312FC1501A36C1400A37E6D14006C7E7F13F86CB47E6C
13F8ECFF806C14E06C14F86C14FEC680013F1480010714C0EB007F020713E0EC007FED3F
F0151F150FED07F8A200C01403A21501A37EA216F07E15036C15E06C14076C15C06C140F
6DEB1F80D8FBF0EB3F00D8F0FE13FE39E03FFFF8010F13E0D8C00190C7FC253D7CBA2E>
I<003FB812E0A3D9C003EB001F273E0001FE130348EE01F00078160000701770A3006017
30A400E01738481718A4C71600B3B0913807FF80011FB612E0A335397DB83C>I<B69038
07FFFEA3000101809038007FE06C90C8EA1F80EF0F001706B3B2170E6D150C80171C133F
17186D6C14385F6D6C14F06D6C5C6D6C495A6D6CEB07806D6C49C7FC91387F807E91381F
FFF8020713E09138007F80373B7DB83E>I<007FB590383FFFFCA3C601F801071380D97F
E0D903FCC7FC013FEC01F06D6C5C5F6D6C5C6D6C13034CC8FC6D6C1306160E6D6C5B6DEB
8018163891387FC0306E6C5A16E06E6C5A91380FF18015FB6EB4C9FC5D14036E7EA26E7F
6F7EA24B7E15DF9138019FF09138038FF8150F91380607FC91380E03FE140C4A6C7EEC38
000230804A6D7E14E04A6D7E49486D7E130391C76C7E01066E7E130E010C6E7E011C1401
013C8101FE822607FF80010713E0B500E0013FEBFF80A339397EB83E>88
D<B500FE91383FFFE0A3000301E0913807FE00C649EC03F0017F6F5A606D6C5D6D6C1403
95C7FC6D6C1406A26D6C5C6D6C141C17186D6C143817306D6D5B6E6C13E05F91383FE001
5F91381FF003DA0FF890C8FC1606913807FC0E160C913803FE1C913801FF185E6E13B016
E0157F6F5AB3A24B7E023FB512C0A33B397FB83E>I<EAFFF8A4EAF000B3B3B3B3A3EAFF
F8A40D5378BD17>91 D<EAFFF8A4EA0078B3B3B3B3A3EAFFF8A40D537FBD17>93
D<EB1FE0EBFFFC3803E03F3907000F80390F8007E0486C6C7E13E06E7EA26E7E6C5A6C5A
C8FCA4147FEB07FFEB3FE0EBFE00EA03F8EA0FF0EA1FC0123F485A90C7FC160C12FEA314
01A26C13036CEB077C903980063E18383FC01E3A0FE0781FF03A03FFF00FE03A007F8007
C026277DA52A>97 D<EB07F8EB1FFF90387C0FC03901F803E03903F001F0D807E013F838
0FC0004848137CA248C7127E153E5A153F127E12FEA3B7FCA248C8FCA5127EA2127FA26C
14037F001F14076C6C13060007140E6D131CD801F013386C6C137090387E03E090381FFF
80903803FC0020277EA525>101 D<147E903803FF8090380FC1E0EB1F8790383F0FF013
7EA213FCA23901F803C091C7FCADB512FCA3D801F8C7FCB3AB487E387FFFF8A31C3B7FBA
19>I<EA03F012FFA3120F1203B3B3AD487EB512C0A3123A7EB917>108
D<3807E01F00FFEB7FC09038E1E3E09038E387F0380FE707EA03E613EE9038EC03E09038
FC0080491300A45BB3A2487EB512F0A31C257EA421>114 D<EBFF03000313E7380F80FF
381E003F487F487F00707F12F0A2807EA27EB490C7FCEA7FE013FF6C13E06C13F86C7F00
037FC67F01071380EB007F141F00C0EB0FC01407A26C1303A37E15806C13077EEC0F00B4
131E38F3C07C38E1FFF038C03F801A277DA521>I<1318A51338A31378A313F812011203
1207001FB5FCB6FCA2D801F8C7FCB215C0A93800FC011580EB7C03017E13006D5AEB0FFE
EB01F81A347FB220>I<D803F0EB07E000FFEB01FFA3000FEB001F00031407B3A4150FA3
151F12016D133F0000EC77F86D9038E7FF8090383F03C790381FFF87903A03FC07E00029
267EA42E>I E /Fb 2 117 df<EA07C012FFA2120F1207AC14FE9038C3FF809038C703E0
9038DE01F013F8496C7EA25BA25BB2486C487E3AFFFE1FFFC0A2222E7EAD27>104
D<1360A413E0A312011203A21207121FB512F0A23803E000AF1418A714383801F0301470
3800F860EB3FE0EB0F80152A7FA81B>116 D E /Fc 9 117 df<387FFFFEA3B5FCA21705
799521>45 D<147E49B47E903907C1C38090391F80EFC090383F00FF017E137F49148048
48133F485AA248481400120F5B001F5C157E485AA215FE007F5C90C7FCA21401485C5AA2
1403EDF0385AA21407EDE078020F1370127C021F13F0007E013F13E0003E137FECF3E126
1F01E313C03A0F8781E3803A03FF00FF00D800FC133E252977A72E>97
D<EC3F80903801FFE0903807E0F890381F803CEB3E0001FC131E485A485A12074848133E
49133C121F4848137C15F8EC03F0397F000FE0ECFF80B5EAFC0014C048C8FCA45AA61506
150E151E007C143C15786C14F0EC01E06CEB07C0390F801F003807C0FC3801FFF038007F
801F2976A72A>101 D<EC03F0EC0FFC91383E0E1C9138FC077E903901F003FE13039038
07E001D90FC013FCEB1F80A2EB3F004914F8137E01FE1303A2484814F0A2150712034914
E0A2150F12074914C0A2151FA216805B153F1203ED7F006D5BA200015B0000495A9038F8
0F7E90387C1EFEEB1FF8903807E0FC90C7FC1401A25DA21403A25D001C1307007F5C4813
0F5D4A5A4AC7FC48137E00F85B387C03F0381FFFC0D803FEC8FC273B7CA72A>103
D<1478EB01FCA21303A314F8EB00E01400AD137C48B4FC38038F80EA0707000E13C0121E
121CEA3C0F1238A2EA781F00701380A2EAF03F140012005B137E13FE5BA212015BA21203
5B1438120713E0000F1378EBC070A214F0EB80E0A2EB81C01383148038078700EA03FEEA
00F8163E79BC1C>105 D<EB07F0EA03FF14E0A2EA000FA214C0A2131FA21480A2133FA2
1400A25BA2137EA213FEA25BA21201A25BA21203A25BA21207A25BA2120FA25BA2121FA2
5BA2123FA290C7FCA25A1307127EA2EAFE0F130E12FCA2131E131CA2EA7C381378EA3C70
EA1FE0EA0780144079BE17>108 D<D801F0EB3F803A07FC01FFE03A0F3E07C1F83A0E1F
0F00FC001E011C137C001C49137E003C13F012385C38783FC012705C91C7FC00F015FE49
5CEA007EA2150101FE5C5BA2150300015D5B15075E0003020F13704914C0A2031F13F000
07ED80E05B1681EE01C0120F49EC0380A2EE0700001FEC0F0E49EB07FC0007C7EA01F02C
2979A733>110 D<D801F013FC3A07FC07FF803A0F3E0F03C0260E1F1C13E0001EEB380F
001C1370003CEBE01F123814C0D8783F14C00070903880070092C7FC91C8FC12F05BEA00
7EA313FE5BA312015BA312035BA312075BA3120F5BA3121F5B0007C9FC232979A726>
114 D<EB01C0EB03F01307A25CA2130FA25CA2131FA25CA2133FA291C7FCA2007FB51280
B6FC1500D8007EC7FC13FEA25BA21201A25BA21203A25BA21207A25BA2120FA25BA2121F
141C1380A2003F133C1438EB0078147014F05C495AEA1F03495A6C48C7FCEA07FCEA01F0
193A78B81E>116 D E /Fd 52 122 df<121C127FEAFF80B3EA7F00B2123EC7FCA8121C
127FA2EAFF80A3EA7F00A2121C09396DB830>33 D<1438147C14FCA4EB03FF011F13E090
B512FC4880000780481580261FFEFD13C09039F0FC3FE0D83FC0131FD87F80EB0FF00100
1307007E15F800FE14035A1507A36CEC03F0A2007F91C7FC138013C0EA3FF0EA1FFE13FF
6C13FF6C14E0000114F86C6C7F011F7F01037F0100148002FD13C09138FC7FE0151FED0F
F015070018EC03F8127E1501B4FCA35AA26CEC03F07E01801307ED0FE0D83FC0131F01F0
EB7FC0D81FFEB512806CB612006C5C6C5CC614F0013F13C0D907FEC7FCEB00FCA5147C14
3825477BBE30>36 D<EA07C0EA0FF0EA1FF8A213FCA213FE120F1207EA007EA513FE13FC
A2120113F81203EA07F0120FEA1FE0127FEAFFC013801300127C12380F1D70B730>39
D<141E147F14FF5BEB03FEEB07FCEB0FF0EB1FE0EB3FC0EB7F80EBFF00485A5B12035B48
5A120F5BA2485AA2123F5BA2127F90C7FCA412FEAD127FA47F123FA27F121FA26C7EA27F
12076C7E7F12017F6C7EEB7F80EB3FC0EB1FE0EB0FF0EB07FCEB03FEEB01FF7F147F141E
184771BE30>I<127812FE7E7F6C7E6C7EEA0FF06C7E6C7E6C7E6C7EEB7F80133F14C013
1FEB0FE014F01307A2EB03F8A214FC1301A214FE1300A4147FAD14FEA4130114FCA21303
14F8A2EB07F0A2130F14E0EB1FC0133F1480137FEBFF00485A485A485A485AEA3FE0485A
485A90C7FC5A1278184778BE30>I<14E0497E497EA60038EC0380007EEC0FC0D8FF83EB
3FE001C3137F9038F3F9FF267FFBFB13C06CB61280000FECFE00000314F86C5C6C6C13C0
011F90C7FC017F13C048B512F04880000F14FE003FECFF80267FFBFB13C026FFF3F913E0
9038C3F87F0183133FD87E03EB0FC00038EC0380000091C7FCA66D5A6D5A23277AAE30>
I<143EA2147FAF007FB7FCA2B81280A36C1600A2C76CC8FCAF143EA229297DAF30>I<EA
03E0EA0FF0EA1FF813FCEA3FFEA213FFA27EA27E1203EA007FA2137E13FEEA01FC1203EA
07F8EA3FF0127FEAFFE0EA7F801300123C1019708B30>I<007FB612F0A2B712F8A36C15
F0A225077B9E30>I<120FEA3FC0EA7FE0A2EAFFF0A4EA7FE0A2EA3FC0EA0F000C0C6E8B
30>I<14FE903807FFC0497F013F13F8497F90B57E48EB83FF4848C6138049137F4848EB
3FC04848EB1FE049130F001F15F0491307A24848EB03F8A290C712014815FCA400FEEC00
FEAD6C14016C15FCA36D1303003F15F8A26D1307001F15F0A26D130F6C6CEB1FE0A26C6C
EB3FC06C6CEB7F806D13FF2601FF8313006CEBFFFE6D5B6D5B010F13E06D5BD900FEC7FC
273A7CB830>48 D<EB03C0497EA2130FA2131FA2133F137F13FF1203123FB5FCA213EF13
8FEA7E0F1200B3B0003FB512F84814FCB612FEA26C14FC6C14F81F3977B830>I<EB07FC
90383FFFC090B512F00003804814FE4880261FF80F1380263FE00113C09038C0007F4848
EB3FE090C7121FED0FF04814075A6C15F81503A3127E1218C8FCA2150716F0150F16E015
1F16C0153FED7F8015FF4A13005DEC07FC4A5A4A5A4A5A4A5A4A5A4990C7FC495A495AEB
0FF0EB3FE0495A495A4890C8FC4848EB01F04848EB03F8485AEA1FE048B6FCB7FCA37E6C
15F025397BB830>I<EB03FF013F13E090B512F84814FE4880481580260FFE0113C09038
F0007F4848EB1FE0150F16F01507A26C5A6C5AC8FC150F16E0A2151FED3FC0157FEDFF80
02071300903807FFFE495B5D8115FF6D1480D9000113C09138003FE0ED1FF0ED07F81503
16FC150116FE1500A21218127EB4FCA2150116FC4814036C15F86C6C13076DEB1FF0D83F
F0133F3A1FFE01FFE06CB612C06C15806CECFE00C65C013F13F001031380273A7CB830>
I<EC03FC4A7E140F141FA2143F147F157E14FEA2EB01FCEB03F8A2EB07F0A2EB0FE0EB1F
C0A2EB3F80A2EB7F0013FEA2485A485AA2485AA2485A485AA2485AA248C7FC12FEB8FC17
80A46C1600C8007EC7FCAA91387FFFFE91B6FCA46E5B29397DB830>I<000FB612804815
C05AA316800180C8FCAEEB83FF019F13C090B512F015FC8181D9FE0313809039F0007FC0
49133F0180EB1FE06CC7120F000E15F0C81207A216F81503A31218127EA2B4FC150716F0
48140F6C15E06C141F6DEB3FC06D137F3A3FE001FF80261FFC0F13006CB55A6C5C6C5C6C
14E06C6C1380D90FFCC7FC25397BB730>I<EC0FF8EC7FFF49B51280010714E0131F4914
F090387FF80F9039FFC007F84813803803FE005B485A4848EB03F0ED01E0484890C7FC5B
123F5BA2127FEB000C903803FFE0010F13F8D8FF3F13FE48B6FCB7128016C09039FE007F
E001F8EB1FF001E0130F49EB07F8ED03FC5B90C7120116FE1500A37EA46C7E15016D14FC
121F6D1303000FEC07F86D130F6C6CEB1FF06DEB3FE03A03FF81FFC06C90B512806C1500
6D5B011F13F8010713E001011380273A7CB830>I<127CB712FC16FEA416FC48C7EA0FF8
16F0ED1FE0007CEC3FC0C8EA7F80EDFF00A24A5A4A5A5D14075D140F5D4A5AA24A5AA24A
C7FCA25C5C13015CA213035CA213075CA4495AA6131F5CA96D5A6DC8FC273A7CB830>I<
49B4FC010F13E0013F13F890B57E4880488048010113803A0FFC007FC0D81FF0EB3FE048
48131F49EB0FF048481307A290C7EA03F85A4815FC1501A416FEA37E7E6D130315076C7E
6C6C130F6D133FD80FFC13FF6CB6FC7E6C14FE6C14F9013FEBE1FC010F13819038006001
1400ED03F8A2150716F0150F000F15E0486C131F486CEB3FC0157FEDFF804A1300EC07FE
391FF01FFC90B55A6C5C6C5C6C1480C649C7FCEB3FF0273A7CB830>57
D<120FEA3FC0EA7FE0A2EAFFF0A4EA7FE0A2EA3FC0EA0F00C7FCAF120FEA3FC0EA7FE0A2
EAFFF0A4EA7FE0A2EA3FC0EA0F000C276EA630>I<007FB7FCA2B81280A36C16006C5DCB
FCA7003FB612FE4881B81280A36C1600A229157DA530>61 D<1278127EB4FC13C07FEA7F
F813FEEA1FFF6C13C000037F6C13F86C6C7EEB1FFF6D7F010313E06D7F9038007FFC6E7E
91380FFF806E13C0020113F080ED3FF8151F153FEDFFF05C020713C04A138091383FFE00
4A5A903801FFF0495B010F13804990C7FCEB7FFC48485A4813E0000F5B4890C8FCEA7FFE
13F8EAFFE05B90C9FC127E1278252F7BB230>I<147F4A7EA2497FA4497F14F7A401077F
14E3A3010F7FA314C1A2011F7FA490383F80FEA590387F007FA4498049133F90B6FCA348
81A39038FC001F00038149130FA4000781491307A2D87FFFEB7FFFB56CB51280A46C496C
130029397DB830>65 D<007FB512F0B612FE6F7E82826C813A03F8001FF815076F7E1501
A26F7EA615015EA24B5A1507ED1FF0ED7FE090B65A5E4BC7FC6F7E16E0829039F8000FF8
ED03FC6F7E1500167FA3EE3F80A6167F1700A25E4B5A1503ED1FFC007FB6FCB75A5E16C0
5E6C02FCC7FC29387EB730>I<91387F803C903903FFF03E49EBFC7E011F13FE49EBFFFE
5B9038FFE07F48EB801F3903FE000F484813075B48481303A2484813015B123F491300A2
127F90C8FC167C16005A5AAC7E7EA2167C6D14FE123FA27F121F6D13016C6C14FCA26C6C
EB03F86D13076C6CEB0FF03901FF801F6C9038E07FE06DB512C06D14806D1400010713FC
6D13F09038007FC0273A7CB830>I<003FB512E04814FCB67E6F7E6C816C813A03F8007F
F0ED1FF8150F6F7E6F7E15016F7EA2EE7F80A2163F17C0161FA4EE0FE0AC161F17C0A316
3F1780A2167F17005E4B5A15034B5A150F4B5AED7FF0003FB65A485DB75A93C7FC6C14FC
6C14E02B387FB730>I<007FB7FCB81280A47ED803F8C7123FA8EE1F0093C7FCA4157C15
FEA490B5FCA6EBF800A4157C92C8FCA5EE07C0EE0FE0A9007FB7FCB8FCA46C16C02B387E
B730>I<003FB712804816C0B8FCA27E7ED801FCC7121FA8EE0F8093C7FCA5153E157FA4
90B6FCA69038FC007FA4153E92C8FCAE383FFFF8487FB5FCA27E6C5B2A387EB730>I<02
FF13F00103EBC0F8010F13F1013F13FD4913FF90B6FC4813C1EC007F4848133F4848131F
49130F485A491307121F5B123F491303A2127F90C7FC6F5A92C8FC5A5AA892B5FC4A1480
5CA26C7F6C6D1400ED03F8A27F003F1407A27F121F6D130F120F7F6C6C131FA2D803FE13
3F6C6C137FECC1FF6C90B5FC7F6D13FB010F13F30103EBC1F0010090C8FC293A7DB830>
I<3B3FFF800FFFE0486D4813F0B56C4813F8A26C496C13F06C496C13E0D803F8C7EAFE00
B290B6FCA601F8C7FCB3A23B3FFF800FFFE0486D4813F0B56C4813F8A26C496C13F06C49
6C13E02D387FB730>I<007FB6FCB71280A46C1500260007F0C7FCB3B3A8007FB6FCB712
80A46C1500213879B730>I<49B512F04914F85BA27F6D14F090C7EAFE00B3B3123C127E
B4FCA24A5A1403EB8007397FF01FF86CB55A5D6C5C00075C000149C7FC38003FF025397A
B730>I<D83FFF90380FFF80486D4813C0B56C5AA26C497E6C496C1380D803F0903803F8
004B5A4B5A151F4B5A5E4BC7FC15FE14014A5A5D4A5A4A5A141F5D4A5A4AC8FC5C13F181
01F37F13F790B57E14EFECC7F01483EC03F8140101FE7F496C7E5B157F497F82151F8215
0F826F7EA26F7E1501821500D83FFF903803FFC0486D4813E0B56C5AA26C497E6C496C13
C02B387FB730>I<383FFFF8487FB57EA26C5B6C5BD801FCC9FCB3B0EE0F80EE1FC0A900
3FB7FC5AB8FCA27E6C16802A387EB730>I<D83FF8ECFFE0486C4913F0486C4913F8A200
7F16F06C6C4913E00007160001EF14BFEC800FA39039E7C01F3FA4ECE03F01E3133EA2EC
F07EA201E1137CA2ECF8FCA201E013F8A214FDEC7DF0A3147FEC3FE0A3EC1FC0A2EC0700
91C7FCADD83FFC903801FFE0486C4913F0B54913F8A26C486D13F06C486D13E02D387FB7
30>I<D83FFC90381FFF80486C4913C0B54913E0A26C6D6C13C06C6E13800003913801F8
00EBF7C0A3EBF3E0A314F013F1A214F8A213F014FCA2147C147EA2143E143FA2141FA215
81A2140F15C1A2140715E1A2140315F1A21401A215F91400A3157DA3153FEA3FFF481380
B5EAC01FA26CEB800F6C496C5A2B387EB730>I<90383FFFE048B512FC000714FF481580
4815C04815E0EBF80001E0133FD87F80EB0FF0A290C71207A44815F8481403B3A96C1407
A26C15F0A36D130FA26D131F6C6CEB3FE001F813FF90B6FC6C15C06C15806C1500000114
FCD8003F13E0253A7BB830>I<007FB512F0B612FE6F7E16E0826C813903F8003FED0FFC
ED03FE15016F7EA2821780163FA6167F17005EA24B5A1503ED0FFCED3FF890B6FC5E5E16
804BC7FC15F001F8C9FCB0387FFFC0B57EA46C5B29387EB730>I<003FB57E4814F0B612
FC15FF6C816C812603F8017F9138003FF0151F6F7E15071503821501A515035E1507150F
4B5A153F4AB45A90B65A5E93C7FC5D8182D9F8007FED3FE0151F150F821507A817F8EEF1
FCA53A3FFF8003FB4801C0EBFFF8B56C7E17F06C496C13E06C49EB7FC0C9EA1F002E397F
B730>82 D<90390FF803C0D97FFF13E048B512C74814F74814FF5A381FF80F383FE00149
7E4848137F90C7123F5A48141FA2150FA37EED07C06C91C7FC7F7FEA3FF0EA1FFEEBFFF0
6C13FF6C14E0000114F86C80011F13FF01031480D9003F13C014019138007FE0151FED0F
F0A2ED07F8A2007C140312FEA56C140716F07F6DEB0FE06D131F01F8EB3FC001FF13FF91
B51280160000FD5CD8FC7F13F8D8F81F5BD878011380253A7BB830>I<003FB712C04816
E0B8FCA43AFE003F800FA8007CED07C0C791C7FCB3B1011FB5FC4980A46D91C7FC2B387E
B730>I<3B7FFFC007FFFCB56C4813FEA46C496C13FCD803F8C7EA3F80B3B16D147F0001
1600A36C6C14FE6D13016D5CEC800390393FE00FF890391FF83FF06DB55A6D5C6D5C6D91
C7FC9038007FFCEC1FF02F3980B730>I<D83FFC903801FFE0486C4913F000FF16F8A200
7F16F06C486D13E0D81FC09038001FC0000F1680A76D143F00071600A7000390380F803E
9039F01FC07EEC3FE0A3EC7FF0A2147D0001157CA29039F8FDF8FCA314F8A300005D01F9
13FCA2ECF07CA201FD137DA2017D5CECE03DA3017F133FA2ECC01FA2013F5CA2EC800F6D
486C5A2D397FB730>87 D<3A3FFF01FFF84801837F02C77FA202835B6C01015B3A01FC00
7F806D91C7FC00005C6D5BEB7F01EC81FCEB3F8314C3011F5B14E7010F5B14FF6D5BA26D
5BA26D5BA26D90C8FCA4497FA2497FA2815B81EB0FE781EB1FC381EB3F8181EB7F008149
7F49800001143F49800003141F49800007140FD87FFEEB7FFFB590B5128080A25C6C486D
130029387DB730>I<D87FFF90381FFFC0B56C4813E0A46C496C13C0D803F8903803F800
6D1307A26C6C495AA26C6C5C151F6D5CEC803F013F5CECC07F011F91C7FCA290380FE0FE
A214F101075BA2903803FBF8A201015B14FF6D5BA26E5AA36E5AB1903803FFF8497F497F
A26D5B6D5B2B387EB730>I<001FB612FC4815FE5AA490C7EA03FCED07F816F0150FED1F
E016C0153FED7F80003E1500C85A4A5A5D14034A5A5D140F4A5A5D143F4A5A92C7FC5C49
5A5C1303495A5C130F495A5C133F495A91C8FC5B4848147C4914FE1203485A5B120F485A
5B123F485A90B6FCB7FCA46C15FC27387CB730>I<007FB612F0A2B712F8A36C15F0A225
077B7D30>95 D<EB3FFC48B57E4814E04880488048809038F00FFE9038E001FF806F7E6C
48133F6C4880C8121FA491B5FC130F137F48B6FC12075A48EBC01F383FFC00EA7FE01380
48C7FC5AA46C143FA26C6C137F9038C001FF263FF80FEBFFC06CB712E0A2000714F76C14
C3C6020013C0D93FF090C7FC2B2A7CA830>97 D<02FC137E3B7FC3FF01FF80D8FFEF0187
7F90B500CF7F15DF92B57E6C010F13872607FE07EB03F801FC13FE9039F803FC01A201F0
13F8A301E013F0B3A23C7FFE0FFF07FF80B548018F13C0A46C486C01071380322881A730
>109 D<EC03FE3A3FFC1FFF80267FFE7F13E000FF90B57E90B612FC6C816CEBFE07C690
38F001FF4A6C13804A137F4AEB3FC091C7121F4915E0160FA217F01607A8160FA217E07F
161F6EEB3FC0A26EEB7F806E13FFDAF00313009138FC0FFE91B55A5E495C6E13C0021F90
C7FCEC03FC91C9FCAD383FFFF8487FB57EA26C5B6C5B2C3C80A730>112
D<ED07F83A3FFF803FFF486DB51280B512C302CF14C06C13DF6C9038FFFC3FD8001F13E0
9238801F809238000F004A90C7FC5C5C5CA25CA45CAF003FB512FC4880B7FCA26C5C6C5C
2A287EA730>114 D<3B3FFFC07FFF80486DB512C0B515E0A26C16C06C496C13803B01FC
0003F000A2000014076D5C137E150F017F5C7F151FD91F805BA214C0010F49C7FCA214E0
0107137EA2EB03F0157C15FCEB01F85DA2EB00F9ECFDF0147D147FA26E5AA36E5AA35DA2
143F92C8FCA25C147EA2000F13FE486C5AEA3FC1EBC3F81387EB8FF0EBFFE06C5B5C6C90
C9FC6C5AEA01F02B3C7EA630>121 D E /Fe 31 122 df<EA0FC0EA1FE0EA3FF0EA7FF8
EAFFFCA313FEA3127F123F121FEA0FDEEA001EA2133E133CA2137C1378A213F8EA01F0A2
EA03E0EA07C0EA0F80121FEA3F00121E120C0F20798D1D>44 D<EA0FC0EA1FE0EA3FF0EA
7FF8EAFFFCA6EA7FF8EA3FF0EA1FE0EA0FC00E0E798D1D>46 D<90381FFF8090B512F000
0314FC000F14FF261FF8071380263FC00113C0018014E0486C7E486C14F07FA56C5A4A13
E0EA3FC0260F000313C0C714804A13004A5A4A5A15F04A5A4A5A5D92C7FC14FE5C13015C
A25CAA90C9FCA8EB03F0497E497E497E497EA66D5A6D5A6D5A6D5A24407ABF31>63
D<16FCA24B7EA24B7EA34B7FA24B7FA34B7FA24B7FA34B7F157C03FC7FEDF87FA2020180
EDF03F0203804B7E02078115C082020F814B7E021F811500824A81023E7F027E81027C7F
A202FC814A147F49B77EA34982A2D907E0C7001F7F4A80010F835C83011F8391C87E4983
133E83017E83017C81B500FC91B612FCA5463F7CBE4F>65 D<922607FFC0130E92B500FC
131E020702FF133E023FEDC07E91B7EAE1FE01039138803FFB499039F80003FF4901C013
00013F90C8127F4948151FD9FFF8150F48491507485B4A1503481701485B18004890CAFC
197E5A5B193E127FA349170012FFAC127F7F193EA2123FA27F6C187E197C6C7F19FC6C6D
16F86C6D150119F06C6D15036C6DED07E0D97FFEED0FC06D6CED3F80010F01C0ECFF006D
01F8EB03FE6D9039FF801FFC010091B55A023F15E002071580020002FCC7FC030713C03F
407ABE4C>67 D<B812F8EFFF8018F018FC18FF26003FFCC76C13C005077F05017F716C7E
727E727E727E721380A27213C0A27213E0A21AF084A21AF8A41AFCA5197FA319FFA51AF8
A41AF0A2601AE0A24E13C0A24E13804E1300604E5A4E5A4D485A050713E0057F5BBA5A4E
C7FC18F818C005F8C8FC463E7DBD50>I<BAFCA4198026003FFEC7123F1707170183183F
A2181FF00FC0A31807EE07C0A3F003E0A3160F95C7FC161F163F16FF91B6FCA54AC6FC16
3F161F040F147CA2160719F8A593C71201A219F01803A21807A2180FF01FE0183F18FF17
03173FBAFCA219C0A33E3D7DBC45>I<ED3FFF0203B512F0021F14FE027F6E7E902701FF
F80713E00107D9C00013F84990C7EA3FFCD93FFCEC0FFF49486E7F49486E7F48496E7F4A
80488448496F7EA24890C96C7E4884A249161F003F84A34848701380A400FF19C0AD007F
19806D5EA3003F1900A26D5E6C60A26C6D4B5AA26C6D4B5A6C6D4A5BA26C6D4A5B6C6D4A
5B6D6C4A5B6DB4023F90C7FC6D01C0EBFFFE0107D9F80713F8010190B612E06D5E021F4A
C8FC020314F0DA003F90C9FC42407ABE4F>79 D<B812F017FF18C018F018FC26003FFCC7
7FEF1FFF7113807113C07113E0A27113F0A319F8A819F0A34D13E019C05F4D1380053F13
00EFFFFE91B712F860188005FCC7FC4ACAFCB3A4B77EA53D3E7DBD47>I<B87E17FCEFFF
8018F08428003FFC000113FE9338003FFF050F7F717F717FA2858385A761A25F61614D5B
4D90C8FCEF3FFE4CB45A91B712F018C04DC9FC717E9126FC000F7F040113F0707F717EA2
717EA2717EA685A6F207C019C0A271140F07E01380B76DEBF01F719038FC3F007190B5FC
716C5B061F13F8CB000113E04A3F7DBD4E>82 D<903A03FFC001C0011FEBF803017FEBFE
0748B6128F4815DF48010013FFD80FF8130F48481303497F4848EB007F127F49143F161F
12FF160FA27F1607A27F7F01FC91C7FCEBFF806C13F8ECFFC06C14FCEDFF806C15E016F8
6C816C816C816C16806C6C15C07F010715E0EB007F020714F0EC003F1503030013F8167F
163F127800F8151FA2160FA27EA217F07E161F6C16E06D143F01E015C001F8EC7F8001FE
EB01FF9026FFE00713004890B55A486C14F8D8F81F5CD8F00314C027E0003FFEC7FC2D40
7ABE3A>I<003FB912FCA5903BFE003FFE003FD87FF0EE0FFE01C0160349160190C71500
197E127EA2007C183EA400FC183F48181FA5C81600B3AF010FB712F8A5403D7CBC49>I<
903807FFC0013F13F848B6FC48812607FE037F260FF8007F6DEB3FF0486C806F7EA36F7E
A26C5A6C5AEA01E0C8FC153F91B5FC130F137F3901FFFE0F4813E0000F1380381FFE0048
5A5B485A12FF5BA4151F7F007F143F6D90387BFF806C6C01FB13FE391FFF07F36CEBFFE1
00031480C6EC003FD91FF890C7FC2F2B7DA933>97 D<EC7FF00107B5FC011F14C0017F14
E09039FFF01FF0489038800FF848EB001F4848EB3FFC120F485AA2485AA2007FEC1FF849
EB0FF0ED03C000FF91C7FCAB127F7FA3003F153E7F001F157E6C6C147C6C6C14FC913880
01F86C9038C003F0C69038F81FE06DB512C0011F14800107EBFE009038007FF0272B7DA9
2E>99 D<EE07F8ED07FFA5ED003F161FAFEC7FF0903807FFFE011FEBFF9F017F14DF9039
FFF01FFF48EBC00348EB00014848EB007F485A001F153F5B123FA2127F5BA212FFAA127F
A37F123FA26C6C147F120F6D14FF6C6C01037F6C6D48EBFFE06CEBF03F6C6CB512BF6D14
3F010713FC010001E0EBE00033407DBE3A>I<ECFFF0010713FE011F6D7E017F809039FF
E07FE0489038801FF048496C7E48486D7E48486D7E121F491301003F81A2485A6F1380A2
12FFA290B7FCA401F0C9FCA5127FA27F123FEE0F806C7E161F6C6C15006C6C5C6C6D137E
6C9038E001FC6C9038F80FF8013FB55A6D14C0010391C7FC9038007FF8292B7DA930>I<
903A03FF8007F0013F9038F83FF8499038FCFFFC48B712FE48018313F93A07FC007FC348
48EB3FE1001FEDF1FC4990381FF0F81700003F81A7001F5DA26D133F000F5D6C6C495A3A
03FF83FF8091B5C7FC4814FC01BF5BD80F03138090CAFCA2487EA27F13F06CB6FC16F016
FC6C15FF17806C16C06C16E01207001F16F0393FE000034848EB003F49EC1FF800FF150F
90C81207A56C6CEC0FF06D141F003F16E001F0147FD81FFC903801FFC02707FF800F1300
6C90B55AC615F8013F14E0010101FCC7FC2F3D7DA834>103 D<13FFB5FCA512077EAFED
1FF8EDFFFE02036D7E4A80DA0FE07F91381F007F023C805C4A6D7E5CA25CA35CB3A4B5D8
FE0FB512E0A5333F7CBE3A>I<EA01F8487E487E487E481380A66C13006C5A6C5A6C5AC8
FCA913FFB5FCA512077EB3ABB512F8A515407CBF1D>I<13FFB5FCA512077EB3B3AFB512
FCA5163F7CBE1D>108 D<01FFD91FF8ECFFC0B590B5010713F80203DAC01F13FE4A6E48
7FDA0FE09026F07F077F91261F003FEBF8010007013EDAF9F0806C0178ECFBC04A6DB448
6C7FA24A92C7FC4A5CA34A5CB3A4B5D8FE07B5D8F03FEBFF80A551297CA858>I<01FFEB
1FF8B5EBFFFE02036D7E4A80DA0FE07F91381F007F0007013C806C5B4A6D7E5CA25CA35C
B3A4B5D8FE0FB512E0A533297CA83A>I<EC7FF0903803FFFE011FEBFFC0017F14F09039
FFE03FF8489038800FFC3A03FE0003FE48486D7E000F168048486D13C0A2003F16E04914
7F007F16F0A400FF16F8AA007F16F0A46C6CECFFE0A2001F16C06C6C491380A26C6C4913
003A03FF800FFE6C9038E03FFC6C6CB512F0011F14C0010791C7FC9038007FF02D2B7DA9
34>I<01FFEBFFE0B5000713FC021FEBFF80027F80DAFF8113F09139FC007FF8000301F0
6D7E4A6D7E4A130F4A6D7E1880A27013C0A38218E0AA4C13C0A318805E18005E6E5C6E49
5A6E495A02FCEBFFF0DAFF035B92B55A029F91C7FC028713FC028113C00280C9FCACB512
FEA5333B7DA83A>I<3901FE01FE00FF903807FF804A13E04A13F0EC3F1F91387C3FF800
0713F8000313F0EBFFE0A29138C01FF0ED0FE091388007C092C7FCA391C8FCB3A2B6FCA5
25297DA82B>114 D<90383FFC1E48B512BE000714FE5A381FF00F383F800148C7FC007E
147EA200FE143EA27E7F6D90C7FC13F8EBFFE06C13FF15C06C14F06C806C806C806C80C6
1580131F1300020713C014000078147F00F8143F151F7EA27E16806C143F6D140001E013
FF9038F803FE90B55A15F0D8F87F13C026E00FFEC7FC222B7DA929>I<EB07C0A5130FA4
131FA3133F137FA213FF5A1207001FEBFFFEB6FCA40001EBC000B3151FA96CEBE03EA201
7F137EECF8FC90383FFFF86D13F0010713E001001380203B7EB929>I<D9FF80EB0FF8B5
EB0FFFA50007EC007F6C153FB3A5167FA316FF6C5C4B7F6C903AC007DFFFE09138F01F9F
6DB5121F6D13FE010F13F8010101E0EBE000332A7CA83A>I<B500FC90383FFFC0A50001
01C0903803E0006E1307A26C5E6E130F017F5D6E131F013F92C7FC6E5B011F143E6E137E
010F147C6E13FCA26D5C15816D5C15C36D5C15E76D5C15FF6E5BA36E90C8FCA26E5AA26E
5AA26E5AA26E5AA232287EA737>I<B5D8FC03B51280A5C69026E0007FC7FC6E13FE6D6C
5B6D6C485A6D6C485A010F13076D6C485AED9FC06DEBFF806D91C8FC6D5B6E5AA2143F6E
7E140F814A7F4A7F4A7F02FE7F903801FC7F49486C7E02F07F49486C7E49486C7E011F7F
49486C7FD97F008001FE6D7FB5D8C007EBFFC0A532287EA737>120
D<B500FC90383FFFC0A5000101C0903803E0006E1307A26C5E6E130F017F5D6E131F013F
92C7FC6E5B011F143E6E137E010F147C6E13FCA26D5C15816D5C15C36D5C15E76D5C15FF
6E5BA36E90C8FCA26E5AA26E5AA26E5AA26E5AA35D14075D000E130FD83F805B387FC01F
D8FFE090C9FC5C143E147E5CEBC1F8387FC3F0387E0FE06CB45A6C5B6C48CAFCEA03F832
3B7EA737>I E /Ff 48 122 df<143F147E14FCEB01F81303EB07F0EB0FE014C0131FEB
3F80A2EB7F00A213FE12015B12035BA212075B120FA25B121FA25BA2123FA35BA2127FA6
90C7FC5AB3A27E7FA6123FA27FA3121FA27FA2120F7FA212077F1203A27F12017F120013
7FA2EB3F80A2EB1FC0130F14E0EB07F0EB03F81301EB00FC147E143F186478CA26>40
D<12FC127E7E6C7E7F6C7E6C7E12037F6C7EA26C7EA2137F1480133F14C0131FA214E013
0F14F0A2130714F8A21303A214FCA31301A214FEA6130014FFB3A214FE1301A614FCA213
03A314F8A21307A214F0130FA214E0131F14C0A2133F1480137F140013FEA2485AA2485A
5B1207485A485A5B48C7FC127E5A18647BCA26>I<EA7F80A8120FEA1F00A3121E123E12
3CA2127C1278A212F8091478871B>44 D<12FFA8080877871B>46
D<14FF010713E0011F13F8497F90B6FC48158014813A03FE007FC04848EB3FE049131F48
48EB0FF0491307001F15F8491303003F15FCA2491301A2007F15FEA390C8FCA34815FFB3
A36C15FE6D1301A5003F15FC6D1303A36C6CEB07F8A26C6CEB0FF0A26C6CEB1FE06D133F
6C6CEB7FC03A01FF81FF8091B5FC6C1500013F13FC6D5B010713E0010090C7FC28457CC2
31>48 D<1418147814F81303130F137FB5FCA413F71387EA0007B3B3AD007FB61280A621
4378C231>I<EB03FE90381FFFE0017F13F890B57E4814FF4815802607FC0713C0380FF0
00D81FC0EB7FE049EB3FF0003F141F90C7EA0FF8481407007E15FCA200FE14034815FE12
7C123C0038140112181208C8FC1503A316FCA2150716F8150F16F0ED1FE0A2ED3FC0ED7F
80EDFF00A24A5A4A5A4A5A4A5A4A5A4A5A4A5A02FEC7FC495A495A495A495A495A495A49
C8FC13FE5B485A485A485A485A485A48C9FC48B612FEA627437CC231>I<49B4FC010F13
E0013F13F890B512FE48800007158048010113C03A1FF8007FE0D83FE0133F49EB1FF048
C7120F123E16F8001C140712181208C8FC150FA216F0A2151F16E0153F16C0157FEDFF80
02031300EC1FFE90380FFFFC5D15E08115FC15FFD9000113809138007FC0ED1FE0ED0FF0
16F8ED07FCA2ED03FEA3ED01FFA80040EC03FE1260A200F0EC07FC7E00FEEC0FF8127FD8
3FC0EB1FF0D81FF0EB7FE0390FFE01FF6CB612806C15006C5C6C6C13F8011F13E0010190
C7FC28457CC231>I<EDFF805C5CA2EC077FA2140FA2141E143EA2147E147C14FCA2EB01
F8130314F01307A2EB0FE0A2EB1FC0133F1480137F14005B5B12015B1203485AA2485A5B
121F5B123F485AA248C7FC90B712C0A6C8387F8000B12A417DC031>I<000FB612F8A601
F0C8FCB1EC3FC09038F1FFF001F313FC90B57EEDFF8016C002E013E0EC003F49EB1FF049
EB0FF84913074914FC15034914FEC8FCA2150116FFAAED03FE12101230003815FC007C14
07007E15F800FE140FD87F80EB1FF06DEB3FE0D83FF0137F3A1FFE03FFC06CB612800003
15006C14FC6C6C5B011F13C0D903FEC7FC28437DC031>I<EC07FC91383FFF8091B512E0
13035B5B90381FFC0390393FE000604948130049C8FC485A5B1203485A5B120F5B121FA2
5B123FA29038803FF8397F81FFFE01877F018F1480019F14C0D93FF713E039FF7F007F01
FCEB1FF049EB0FF84913074914FC15035BED01FE5BA2150016FFA290C8FCA36C7E90C8FC
A27FA3123F16FE6D1301A2121F6DEB03FC120F6DEB07F812076DEB0FF06C6CEB1FE06DEB
3FC03901FF80FF6C90B512806D14006D13FC010F5B6D13E0010090C7FC28457CC231>I<
EDFF804A7FA34A7FA3913807EFF0A215E7020F7F15C7A2021F7F15C391383F83FEA21581
027F7F1501814A805CA201016E7E5CA201036E7E5CA201076E7E5CA2010F6E7E5C011F81
16075C013F8116035C017F818291B7FC90B87EA34883A201FCC8127F0003707EA2484882
171F5B000F83170F5B001F8317075B003F8317035B007F838390C9FC48701380A239457D
C440>65 D<B612F8EDFF8016E016F816FE82902680003F13C003037F03007F163F707E70
7E16071603831601A516035F16075F160F4C5AEE7FE04C5A03035B033F90C7FC90B612FC
16F016C08216FC16FF902680003F13C003037F9238007FF0EE1FF8707E707E707E827013
80177F18C0A2173FA4177FA2188017FF5E4C13004C5A160FEE3FFCEEFFF8030F5B90B75A
178094C7FC16FC16E04BC8FC324577C441>I<ED3FFE0203B512F0020F14FE023FECFF80
91B7FC5B49D9E0071300010F90C7FCD91FFC141F49481407D97FE0804A91C7FC495A4890
CAFC5A5B485AA2485AA2485AA2485AA3485AA5485AAD6C7EA56C7EA36C7EA26C7EA26C7E
A26C7E7F7E6C6D15806D6C14016E1403D93FF8140F6D6CEC1FC06DB4147F01039038E003
FF6D90B612806DEDFE00023F5C020F14F0020314C09126003FFCC7FC32497AC63E>I<B6
12FEEDFFE016F816FE707E83902680000713F003007FEE3FFCEE0FFE1607707E70138070
13C0177FEF3FE018F0171F170F18F8A2EF07FCA2170318FEA31701A218FFAC18FEA21703
A3EF07FCA3EF0FF8A2EF1FF0A2EF3FE0177FEFFFC04C13805E4C13004C5AEE3FFCEEFFF8
03075B90B75A17804CC7FC16F816E04BC8FC384578C446>I<B812F0A60180C9FCB3A690
B71280A60180C9FCB3A890B712F8A72D4578C43A>I<B812C0A60180C9FCB3A790B612FC
A60180C9FCB3AE2A4578C437>I<ED3FFC4AB512E0020F14F8023F14FF91B712C04916E0
49EBE0074990C7127FD91FFCEC1FC0494814074A1403D97FC01401494814004817004890
CAFC5B485AA2485AA2485AA2485AA3485AA5485AAA4BB512F0A36C7EA392C7120FA26C7E
A36C7EA26C7EA26C7EA26C7E7F6C7F7E6D7EEB3FF0806D7ED907FF143F6D9038E007FF6D
90B6FC6D16E0023F1500020F14FC020114E09126003FFCC7FC34497AC641>I<B46CED3F
E0B3AC90B8FCA60180C8123FB3AF334578C444>I<EAFF80B3B3B3AF094577C41B>I<B46C
ED3FF818F0EF7FE0EFFFC04C13804C13004C5A4C5A4C5A4C5A4C5A4C5A4B5B4B90C7FC4B
5A4B5A4B5A4B5A157F5E4B5A4A5B4A90C8FC4A5A4A5A4A5A4A5A4A5A4A7E138101837F01
877F138F019F7F9038BFF3FFEBFFE302E17F02C07F5C4A6C7E496D7E5B496D7E496D7E5B
496D7E491303826F7F8183707EA2707E707EA2707E707EA2707E701380A27013C0177F18
E0EF3FF0A2EF1FF8EF0FFC364578C443>75 D<B47EB3B3B3A990B612FEA6274577C435>
I<D8FFF0933803FFC06D5EA36D5EA3017EEE1FBFA2017F163FA26D173F6E157FA2011F16
7E6E15FEA26E1401010F16FCA26E1403010716F8A26E1407010316F0A26E140F010116E0
6E141FA2010016C06E143FA26E15806F137FA2023F15006F5B021F5CA2EDE001020F5CA2
EDF00302075CA2EDF80702035CA26E6C485AA36E6C485AA392387F3F80A3033F90C7FCA2
ED1FFEA36F5AA36F5A92C9FCA2424577C455>I<D8FFF8ED1FE07FA27FA27FA26D7EA26D
7EA280131F80130F80130780130380A26D7EA26D7FA26E7EA2143F81141F81140F811407
81140381140181801680157F16C0A2ED3FE0A2ED1FF0A2ED0FF8A2150716FC150316FE15
0116FF81179F167FA2EE3FDFA2EE1FFFA282A282A282334578C444>I<ED3FE0913803FF
FE021FEBFFC04A8091B612F8010315FE499038C01FFF49D900077FD91FFC01017FD93FF0
6D6C7E49486E7E49486E7E4A140F4890C86C7E48486F7E49150100078348486F1380A249
167F001F18C049163F003F18E0A249161F007F18F0A449160F00FF18F8AC6D161F007F18
F0A46D163F003F18E0A36C6CEE7FC0A26D16FF000F18806D5D000718006D5D6C6C4B5A6C
5F6E140F6C6D4A5A6D6C4A5AD93FF8ECFFE06D6C495B6DB401075B6DD9E03F90C7FC6D90
B55A010015F86E5C021F14C0020349C8FC9138007FF03D497BC648>I<B612FCEDFFC016
F016FC16FF1780902680000F13C0030113E09238007FF0EE1FF8160FEE07FCA2EE03FE16
01A217FFA282A45EA217FEA21603EE07FCA2EE0FF8161FEE7FF0923801FFE0030F13C090
B71280170016FC16F016C003FCC7FC0180C9FCB3AB304578C43E>I<B612F8EDFF8016F0
16FC82707E902680000F7F03017F6F6C7EEE1FF8707E1607707EA2160183A282A35EA25F
1603A24C5A160F4C5AEE7FF04B485A030F5B90B75A4CC7FC5E16F0168093C8FCEB800082
157F82153F826F7EA26F7E1507821503821501826F7FA2707E163F83161F83707EA2707E
A2707E160183701380A2EF7FC0324577C43F>82 D<EC3FF80103B57E010F14E0013F14F8
4914FE90B7FC5A48EBC00F4890380001FED80FFCEB007E49141E4848140E484814064991
C7FCA2485AA77FA26C7E7F7F6C7E6CB4FC14E06C13FE6CEBFFC06C14FC6C14FF6D14C06D
80010F14F8010380D9003F7F02037FEC007F030F1380030313C01500167FEE3FE0A2161F
17F0A2160FA7EE1FE012600070153F007816C0007E157F007FEDFF80D8FFE049130001F8
13079039FF803FFE6C90B55A001F5D00075D000115C06C6C5C010F01FCC7FC010013E02C
497CC636>I<BA12F0A6C8D83FE0C8FCB3B3B3A93C457DC443>I<B46CED7F80B3B3AF6C6C
EDFF00A46C6C4A5AA26C6C4A5A16076C6C5D6C6C140F6D4A5A6C6CEC7FE06C9039C001FF
C06CD9F8075B6DB6C7FC011F5C6D14F8010314E001001480DA0FFCC8FC314778C442>I<
D87FE0ED03FE6C6C15076D4B5A6C6C5E000F161F6C6C4B5A6D5E6C167F6C6D4A5A6C6D5D
4C90C7FC6D6C5B6D6C5C011F4A5A6E130F6D6C5C6D6C495A163F6D6C5C6D6D485A6D14FF
03C15BDA7FE190C8FC91383FE3FEEC1FF7EDFFFC6E5B805E6E5B806E5B5E824A7F5C824A
7F5CEDF7FC91381FF3FE91383FE1FF15C1DA7FC07F4A486C7E8349EB003F49486D7E0107
814A130F49486D7E011F814A6D7E49487F017F824A6D7F49486E7E5A91C86C7E48486F7E
1207496F7E48486F7E001F83484881496F1380007F7013C0484817E049167F3B457EC440
>88 D<D8FFC0EE0FF87F007FEF1FF06C6CEE3FE07F001FEF7FC07F6C6CEEFF8000074C13
007F6C4C5A6C6D4A5A806C4C5A6D6C4A5A80013F4B5A6D6C4A5A80010F4B5A6D6C92C7FC
5E6D6C495A03805B6D14076D6D485A03E05B027F131FDA3FF05B163F6E6C485A020F5CED
FCFF020791C8FC6EB45AA26E5B5E806F5A5E153FB3AA3D457FC440>I<003FB81280A518
00C9EA07FEA24C5A5F161F4C5AA24C5A4C5AA24B5B4B90C7FCA24B5A4B5AA24B5AA24B5A
4B5AA24B5A4A5BA24A90C8FC4A5AA24A5A5D141F4A5AA24A5A4A5AA2495B4990C9FCA249
5A495AA2495AA2495A495AA2495A485BA24890CAFC485AA2485A5B121F485AA248B81280
B9FCA531457BC43C>I<EB07FE90387FFFC00003B57E000F14F84880819038F803FFEB80
01001EC713800018147F0010EC3FC0C8FC16E0151FA8EC7FFF010FB5FC133F48B6FC5A00
0FEBF01F381FFE00EA3FF8EA7FE05B485A90C7FCA4153F7F6C6C137F9038E001FFEBF80F
6CB6FC7E15DF6C141F000313F8C60180C7FC232F7CAD2F>97 D<EC7FE0903803FFFE010F
EBFF80013F14E04914F090B6FC48EB801F3A03FE0003E04848130048481460491400485A
A2485AA2485AA390C9FC5AAA6C7EA37F123FA26C6C14106D14306C6C14F06C6C13016C6C
13079038FF803F6C90B5FC6C6C14E06D14806D1400010713F8010013C0242F7DAD2B>99
D<ED01FEB3A6EB03FC90380FFFC1013F13F14913F948B6FC5AECC07F48EB001FD80FFC13
07484813035B48481301A25B127F5BA348C7FCAA7F127FA36C7EA26D13036C7E1507D80F
FC130F6C6C133F9038FF80FF6C90B5FC6C14FD6C14F1013F13E16D1381D903FCC7FC2746
7DC432>I<EB01FE903807FFC0011F13F0017F7F90B57E488048EB03FF3807FC004848EB
7F8049133F4848EB1FC0150F484814E0491307127FA290C7FCED03F0B7FCA648C9FCA37E
A27EA27F123F7FA26C7E6D14106C6C14706C6CEB01F06C6C13079038FF803F6C90B5FC6C
15E0013F14806DEBFE00010713F8010013C0242F7DAD2B>I<D901FCEB07E090390FFF80
FF013F13E74990B512F090B7FC5A2603FE03EBC0002607F80090C7FC497F000F8149133F
A248486D7EA86C6C495AA26D137F000792C7FC6D5B3903FE03FE90B55A485C485C5D018F
1380261F81FCC8FC0180C9FCA47F7F6CB512F8EDFF806C15E016F86C81488148815A273F
E0000F1380D87F80130090C8127F48ED3FC048151FA5007FED3F806D147F6C6CECFF0001
F813076CB4EB3FFE6C90B55A6C5D000115E06C6C1480011F49C7FC010113E02C427DAC31
>103 D<EAFF80A9C7FCB0EA7F80B3B3A809457AC417>105 D<EC7FC039FF01FFF801077F
011F7F497F491480EBFE03D9F80013C049137F49133F4914E0151F5BA390C7FCB3AC232D
79AC32>110 D<EC7F80903803FFF0010F13FC013F13FF498090B67E4801C07F3A03FE00
1FF048486D7E48486D7E49130348486D7E491300003F814980007F1680A390C8123F4816
C0AA6C6CEC7F80A36D14FF003F16006D5B001F5D6D13036C6C495A6C6C495A6D131F3A03
FFC0FFF06C90B55A6C5D013F91C7FC6D5B010313F09038007F802A2F7DAD31>I<EC3FC0
39FF03FFF0010F13FC013F7F497F90B61280D9FE0713C0D9F00013E049137F49EB3FF049
131F90C7EA0FF8A2ED07FCA21503A216FE1501AAED03FCA3150716F8150FED1FF07F6DEB
3FE06D13FF6D4813C0D9FC0F138090B612006D5B6D5B6D5B010713E0010090C7FC91C8FC
B2274079AC32>I<903901FE01FE90380FFF81013F13E14913F990B512FD4814FF48EBE0
7F48EB001F4848130F01F81307485A1503485A491301127F5BA348C7FCAA7F127FA27F12
3F7F15036C7E6D13076C6C130F6C6C133F9038FFC0FF6C90B5FC6C14FD6C14F1013F13E1
6D1381903803FC0190C7FCB227407DAC32>I<141F00FE13FF13035B131F5B5BEBFFF014
8038FFFE005B5B5B5B5BA25BA390C7FCB3A8182D79AC21>I<EB3FF848B5FC4814C0000F
14F04814F85AEBE00F397F8001F090C7127000FE14301500A57E7FEA7FE013FC383FFFE0
6C13FC14FF000714806C14E06C14F06C7E010713F89038003FFC14071403EC01FEA21400
A412400070EB01FC1278007E130339FFE01FF890B512F0A26C14E0001F14800003EBFE00
38003FF01F2F7DAD25>I<B4EC1FE0B3AE153FA2157FA26D13FF1403387FE00F90B6FC6C
14DF151F6C13FC000713F0000190C8FC232D79AB32>117 D<B46CD91FE0EB01FE007F6F
EB03FCA2153F6C6C6EEB07F8153D157D6C6C17F0DB7CFC130FA215FC6C6C6EEB1FE015F8
1401D807F8027E14C0047F133F15F01403D803FC6E1480EF807F15E000010107160001FE
141F715A15C00000010F5D01FF140F17E1017F01805CA2021F1307D93F9FECF3F8150016
03A2D91F9E5D14BE1601010F5E02FC14FF82A26D485DA23F2C7FAB42>119
D<B415FFA27F007FEC01FE7F123FED03FC7F001FEC07F87F120FED0FF07F12076DEB1FE0
120316C06C6C133FA216806C6C137FA26D14006E5A5D133F14C1011F5BA2ECE1F8EB0FE3
A201075B14F3A2903803F7E0A201015BA2EB00FF5DA2147F92C7FCA2147E14FEA25C1301
A25C13035C13075CEA400F38781FC0EA7FFF5C91C8FC5B5BEA0FF028407EAB2D>121
D E /Fg 19 90 df<121EEA3F80EA7FC012FFA41380EA7F00123C0A0A788919>46
D<EC07F8EC3FFF9138FC0FC0903903F003E0903907C001F0D90F8013F849C7FC013E14FC
017E147C017C147E13FC485AA20003157F5B1207A2120F5BA2121F16FF5BA2123FA44848
EB01FEA648C7EA03FCA5ED07F8A25A16F0A2150F16E0A3ED1FC0A21680007E143F160015
7E123E003F5C4A5AD81F805B000FEB07E06C6C485A2603F03FC7FC3800FFFCEB1FE0283F
79BC2D>48 D<157015F014011407143F903803FFE0137FEBFFCFEBF80F1300141F15C0A5
143F1580A5147F1500A55C5CA513015CA513035CA513075CA5130F5CA3131F497EB612F8
A31D3D78BC2D>I<17E016011603831607A2160FA2161F83163FA2167F167716F7EEE7FC
ED01E316C3150316831507EE03FEED0F01150E151E151C153C03387FED7800157015F05D
4A4880177F4A5AA24AC7FCA2020E81173F5C021FB6FC5CA20270C7EA3FE0171F5CA2495A
A2494881170F49C8FCA2130EA24982013C1507A2137CD801FE4B7E2607FF80EC3FFEB500
F00107B512FC19F85E3E417DC044>65 D<DCFFC01338030F01F01378037F01FC13F0913A
01FF803F01913A07FC000781DA1FE0EB03C3DA7FC0EB01E74AC812FF4948ED7FE0D907FC
153F495A4948151F495A4948150F494816C018074890C9FC485AA2485A000F1880491603
121FA248481607A295C7FC485AA412FF5BA75BA2181C183C1838A27F007F1778187018F0
003F5F6D150160001F16036C6C4B5A95C7FC6C6C5D6C6C151E6C6C5D6C6C15F86D6C495A
6D6CEB07C0D91FF0EB1F80D907FE01FEC8FC0101B512F86D6C13E0DA07FEC9FC3D4276BF
42>67 D<013FB7FC18E018F8903B007FF0000FFE6E48EB01FF9438007FC04B6E7E180F85
727E727E147F4B6E7EA2727EA302FF178092C9FCA54918C05CA41A8013034A5DA41A0013
074A5DA261A24E5A130F4A5E180F61181F61011F4C5A5C4E5A4EC7FC4D5A4D5A013F4B5A
4A4A5AEF3FE0EF7F80017F4A48C8FC01FFEC1FFCB812F0178004FCC9FC423E7DBD45>I<
013FB812F8A39026007FF0C7127F6E48140F18034B14011800A31978147F4B1570A502FF
143892C7FCA3190017784915704A14F016011603160F91B6FC495DA29138FC001F160716
03160101075D5CA2197019F019E0010F4A5A4A90C7120119C0A218031980011F16075CF0
0F00A260181E013F163E4A157E4D5A1703017F150F01FFEDFFF8B9FCA2603D3E7DBD3E>
I<4BB46C1370031F01F013F0037F9038FC01E0913A03FF807E03913A0FF8000F83DA1FE0
EB07C7DA7F80EB01EF4AC812FFD903FE16C04948157F4948153F495A4948151F495A4948
168091C9120F5A485AA2485A000F18004982121FA248485EA295C7FC485AA412FF5BA604
3FB512E05BA29339001FFC00715AA2607F127FA2171F123F6D5EA2121F7F000F163F6C7E
6C6C4B5A7F6C6C15FF6C6DEB01EFD93FC0EB07C7D91FF0EB1F87D907FE9038FE03800101
B5EAF8016D6C01E0C8FCDA07FEC9FC3C4276BF47>71 D<011FB512FC5BA29039003FF800
6E5AA25DA5143F5DA5147F5DA514FF92C7FCA55B5CA513035CA513075CA5130F5CA5131F
5CA3133F497E007FB512F0A2B6FC263E7EBD21>73 D<90263FFFF0933807FFFE5013FC62
9026007FF8EFFC00023F4D5AA2023BEF77F0A2DA39FC16E7A2F101CF0279EE038FDA70FE
5FF1070FA2190E1A1FDAF07F151C02E060193819706F7EF1E03F130102C0DB01C05BA26F
6CEB0380A2953807007F0103160E4A6C6C93C7FC60A2606201076D6C5B02005F60A26F6C
485A94380380015B010EDB07005BA2923801FC0EA24D1303131E011C6D6C485C5FA25F19
07013CEC7FC0013860013C5D137C01FE6EC7120F2607FF80013E4A7EB500FC031FB512F8
043C5E4A131C573E7DBD53>77 D<90263FFFE0023FB5FC6F16FEA29026003FF8020313C0
021F030013004A6C157C023B163C6F15381439810238167802787FDA707F157082153F82
031F15F002F07FDAE00F5D8215078203031401010180DAC0015D82811780047F13030103
15C04A013F5C17E0161F17F0040F1307010715F891C7000791C7FC17FC160317FE04015B
4915FF010E6E130E188E177F18CEEF3FDE011E16FE011C6F5AA2170FA21707133C01386F
5A133C017C150113FE2607FF801400B512FC18705C483E7DBD44>I<923803FF80031F13
F09238FE01FE913903F0003FDA0FC0EB1FC0DA3F80EB07E0027EC76C7E49486E7E494881
49486E7E4948157F495A013F17804948ED3FC049C9FCA24848EE1FE012035B000718F05B
120FA2485A19F8123F5BA2127FA219F04848163FA5F07FE0A35BF0FFC0A219805F19007F
4D5A127F4D5A60003F160F6D5E001F4C5A4D5A6C6C4B5A95C7FC6C6C15FE00034B5A6C6C
4A5A6C6C4A5A017FEC1FC06D6C495AD90FE001FEC8FC903903F807F80100B512C0DA0FFC
C9FC3D4276BF47>I<013FB612FEEFFFE018F8903B007FF0000FFC6E48EB01FF7113804B
EC7FC0183F19E0F01FF0A2147F5D19F8A402FFED3FF092C8FCA219E0A2F07FC05B4AEDFF
8019004D5A4D5AEF0FF80103ED3FE04A903801FF8091B648C7FC17F002FCCAFCA213075C
A5130F5CA5131F5CA5133F5CA3137F497EB612E0A25D3D3E7DBD3E>I<923803FF80031F
13F09238FE01FE913903F8003FDA0FE0EB1FC0DA3F806D7E4AC7EA03F0D901FC8149486E
7E49486E7E010F82494881494816804948ED3FC013FF91C9FC484817E00003171F5B0007
18F0A2485AA2485A19F8123FA25B127FA219F04848163FA519E0187F5BA219C018FF1980
A24D1300A24D5A6C7E4D5A60003F160F037C5C6C6C48B4495A913A0783803FC0000F9026
0E01C05B9026F00C0049C7FC0007011CEBE0FE2603F818EB61FCD801FCEC73F8D800FEEC
77F0017FEC7FC0D93F985CD90FFC01FEC8FC902703FE07F813030100B5FC91260FFC3C5B
91C7FC180E163E181E043F137CEF81FC17FF60A260A2705B60705B7048C7FCEE01F83D52
76BF47>I<013FB612F017FF18E0903B007FF0003FF86E48EB07FCEF01FE4B6D7EF07F80
19C0183F19E0147F4B15F0A502FFED7FE092C8FCA219C0F0FF80A2494B13004A5D4D5AEF
0FF04D5AEF7F800103DA07FEC7FC91B612F017809139FC0007E0EE03F8EE00FC0107814A
147F717EA284A2130F5CA484011F157F5CA41902013F17075CA2F0F00F017F170E496C14
3FB600E0011F131C94380FF83C4B01071378CA3801FFE09438003F8040407DBD43>I<92
39FF8003800207EBF007021F9038FC0F0091387F00FE02FCEB1F1FD903F0EB07BF49486D
B4FC49487F4A6D5A49C8FC49157E133E137E173E49153CA57F1738A26D92C7FC808080EB
7FFEECFFE06D13FEEDFFC06D14F06D14FC010380010080143F020380DA003F7F15031500
707E163F161FA2160F121CA31607160F003C5EA35F003E151F94C7FC007E5D007F153E6D
5C16FC01E0495AD87DF0495AD8FCFCEB0FC03AF87F803F8027F01FFFFEC8FCD8E00713F8
39C0007FC031427BBF33>I<0007B912F0A33C0FFE000FF8003F01F0160F01C04A130348
48160190C7FC121EF000E048141F5E1238A212781270153F5E5AA3C81600157F5EA515FF
93C9FCA55C5DA514035DA514075DA5140F5DA3141FEC7FFC0003B7FCA33C3D76BC42>I<
B600E090B512FC4B15F8A2000101C0C7000F13006C49EC03FCEF01F091C9FC60A317015A
495EA417031203495EA4170712074993C7FCA45F120F49150EA4171E121F49151CA4173C
123F491538A31778177017F05F001F15015F16036D4A5A000F93C8FC5E6C6C141E6C6C5C
000115F86C6C495A017FEB07C090393FC03F8090260FFFFEC9FC010313F89038007FC03E
4073BD44>I<B66C0103B51280A3000101F0C8EBF0006C49ED7FC06D486FC7FC6E153E01
3F163C606D6C5D606D6C4A5A17036D6C4A5A95C8FC6E140E0103151E5F6D6C14385F6D6D
13F04C5ADA7FC05B4C5AEDE007023F49C9FC161E91381FF01C5E91380FF8785E6E6C5AED
FDC015FF6E5B93CAFC6E5AA35DA21403A45DA21407A45DA2140FA4141F4A7E013FB512F0
A3413E75BD44>89 D E /Fh 10 58 df<13FF000313C0380781E0380F00F0001E137848
133CA248131EA400F8131FAD0078131EA2007C133E003C133CA26C13786C13F0380781E0
3803FFC0C6130018227DA01E>48 D<13E01201120712FF12F91201B3A7487EB512C0A212
217AA01E>I<EA01FC3807FF80381C0FC0383003E0386001F0EB00F812F86C13FCA2147C
1278003013FCC7FC14F8A2EB01F0EB03E014C0EB0780EB0F00131E13385B5B3801C00CEA
0380380600185A5A383FFFF85AB512F0A216217CA01E>I<13FF000313C0380F03E0381C
00F014F8003E13FC147CA2001E13FC120CC712F8A2EB01F0EB03E0EB0FC03801FF00A238
0003E0EB00F01478147C143E143F1230127812FCA2143E48137E0060137C003813F8381E
03F0380FFFC00001130018227DA01E>I<14E01301A213031307A2130D131D1339133113
6113E113C1EA01811203EA07011206120C121C12181230127012E0B6FCA2380001E0A6EB
03F0EB3FFFA218227DA11E>I<00101330381E01F0381FFFE014C01480EBFE00EA1BF000
18C7FCA513FE381BFF80381F03C0381C01E0381800F014F8C71278A2147CA21230127812
F8A214784813F8006013F0387001E01238381E07803807FF00EA01F816227CA01E>I<EB
0FC0EB7FF03801F0383803C0183807803C380F007C121E001C1338003C1300A2127C1278
EB7FC038F9FFE038FB80F038FE0038143C48131EA248131FA41278A36C131EA2001C133C
001E13386C1370380781E03801FFC038007F0018227DA01E>I<1230123C003FB5FCA248
13FE14FC3860001C143814704813E014C0EA0001EB0380EB07001306130E5BA25BA21378
A35BA41201A76C5A18237CA11E>I<137F3803FFC0380781E0380E00704813380018131C
1238A3123C003F1338381FC078EBE0F0380FF9E03807FF80120114C0000713F0380F0FF8
381C03FC383801FE3870007E141F48130F1407A314060070130E0078130C6C1338001F13
F03807FFC0C6130018227DA01E>I<13FE3803FFC0380781E0380E0070481378003C1338
48133CA200F8131EA3141FA40078133FA26C137F121C380F01DF3807FF9F3803FE1EC7FC
A2143E143C001C1338003E13781470003C13E0381801C0381C0780380FFE00EA03F81822
7DA01E>I E /Fi 2 110 df<121EEA7F80A2EAFFC0A4EA7F80A2EA1E000A0A798919>58
D<D801F0D90FF0EB03F8D807FCD93FFEEB1FFFD80F1FD9F01F90387C0F80000E903C03C0
0F80E007C0271E0F87009039C3C003E0001C018E903807C780003C01DCDAEF007F003801
F814EE4A14FCD8781F5D00705B4A5CA200F04949481307013F60000090C75BA2041F140F
4960017E5D191F043F5D13FE4992C7123F97C7FC5E000195387F01C049027E147EA204FE
ECFE03000306FC1380495C1A07030103F81300000761494A150E620303163C000FF07C78
494AEC3FE0D80380D900E0EC0F804A297EA750>109 D E /Fj 6
117 df[<0803B500C0EE01F00703B600FEEE03F8077FDBFFE015070607B800FC150F063F
05FF151F4DBA00E0143F050F07F8147F053F07FE14FF94BC5B04039326F8000FECC00304
0F4BC86CEBF007043F03C0030F6D5A93B648C900036D5A4B03F09339007FFF3F030703C0
051F90B5FC4B92CB7E033F02FC18034B02F08492B648844A0380193F4A92CD7E4A4A864A
4A864A02F0864A4A864A8991B65A494B874992CF7E4C885B494A885E498B494A88A2495C
8D90B65A8D5A5E48217FA24892D1FC223FA25A5DA248211FA3485CFA0FF09FC7FCA25AA4
5DA3B6FCB27EA381A47EA46C80FA07F0FA0FF87EA2817EA36C6F1D1F23F07E827E223F6D
6E1EE0A26D6E1D7F23C06D6E1DFF7F705213806D806D55130070646D6F646D6F515A6E6E
1B1F6E6E515A6E6E515A6E6E1BFF6E6E505B6E6E505B6E6F4F5B6E03E04F90C7FC6F6EF1
3FFE6F02FC4F5A030F02FF4E485A6F03C005075B030103F0051F5B6F03FE057F1380043F
DAFFE00303B5C8FC040F03FE033F13FC0403DBFFF80107B55A040093B812E0053F1A8005
0F4FC9FC050119F8DD003F18C0060795CAFCDE007F16F0070393CBFCDF000314C0>141
146 115 271 168 67 D<94387FFFC0040FB6FC93B712E0030716FC031F16FF037F17C0
4AB912F00207DAF80380021F912680003F13FE4A49C7000F7F4A01F802038049B5486E80
4902C06E6C7F494A6F7F4991C9FC49727F4949707F4B84498490B548707F5A4B19804885
5D481CC086481CE05D5A871DF05AA25D5AA21DF887A2B6FCA392BBFCA51DF00380CDFCA7
7EA4817EA37EA2817EA26CF307F06FF00FF87E816C1B1F6F19F06C1B3F6D6DF07FE06D7F
F4FFC06D6E4C13806D6E5E6D02F04C13006D6EEE1FFE6D6E4C5A6D6C01FFEEFFF86E02E0
02035B6E02FC021F5B02079126FFC003B55A6E92B7C7FC020060033F17F8030F17E00301
1780DB003F03FCC8FC040315C0DC000F01F8C9FC5D5F7ADD6A>101
D<DB3FE0913803FFFC017FB5033FEBFFE0B792B612F8060715FE061F6F7E4E16E095B87E
4DD9FC03804DD9C000804D48C76C7FDD0FF880D8003FDB1FE08201074B486E804D5A6D03
FEC881DCE1FC815F04E385EEE7F04D81EEEFC0A2DCFF8084A294C9FCA25EA35EA45EB3B3
AFB9D8E001B912C0A9725D77DC81>110 D<94381FFFF00407B612C0047F15FC0303B87E
030F17E0037F17FC4ABAFC4A9126FC007F80020F02C0010714E04A49C880027F01F8033F
13FC91B5486F7F4902C003077F494A6F804991C96C80494970804949717F49874949717F
A290B548717F48884B83481D80A2481DC04B83481DE0A2481DF0A3484A7114F8A4481DFC
A5B61BFEAF6C1DFCA56C6E4D14F8A36C1DF0A36C1DE06F5F6C1DC0A26C6E4D1480A26C1D
006F5F6C646D6D4D5B6F94B5FC6D636D6D4C5C6D6E4B5C6D6E4B5C6D02F0031F5C6D6E4B
91C7FC6D6C01FE92B512FC6ED9FFC001075C6E02FC017F5C020791B812C0020196C8FC6E
6C17FC031F17F003031780DB007F03FCC9FC040715C0DC001F01F0CAFC675F7ADD74>I<
92261FFFF814F80203B638C001FC023FEDFC0791B8121F010317FF130F013F9038F8001F
4990C8FCD9FFF8153F4801E0150F484915034849814890CAFC197F4848173F191F485AA2
007F180FA31907487EA27FA28002E0705A6E93C8FC14FC14FF15F06CECFF8016FCEEFFF0
6CEEFF8018F06C17FE727E6C18E0856C18FC6C846C727E6C856D84011F846D8413030100
84023F83140F020183EC001FDB007F16801603DC000F15C01700183F060F14E0007F1703
486C82727E857F85857FA2857F1BC07FA27F1B806D5F7F1B006E5E6E5F6E163F6E4C5A02
FC4C5A6E03035B6E6C4A5B03F0023F5B03FF0107B55A01F991B7C7FCD9F07F16FCD9E01F
16F0D9800716C0D9000193C8FC48D9003F14F8007C020349C9FC4B5F78DD5C>115
D[<ED03FEA81507A5150FA4151FA3153FA2157FA215FFA25CA25C5CA25C5C5C5C91B5FC
13035B131F017F91B712F00007BAFCBBFCA7C74AC9FCB3B3AAF101FFB1616E17FE82A219
076E17FC836EEE0FF871131F6E6EEB3FF071137F6E6EEBFFE06EDAFF0313C06E92B51280
6E1700033F5D6F5D03075D030015E0041F1480040001FCC7FC>72
132 124 258 90 I E /Fk 1 14 df<EE7FFE0307B512E0033F14FC92B7FC0203D9C003
13C0DA0FFCC7EA3FF0DA3FE0EC07FCDA7F80EC01FED901FEC9EA7F80D903F8EE1FC0D907
E0EE07E04948707E4948707E49CB7E017E187E498449844848F00F8000031AC049180748
48F003E0A24848F001F0A248CD12F8A2001E1A78003E1A7CA2003C1A3C007C1A3EA20078
1A1EA300F81A1FA2481A0FAB6C1A1FA200781A1EA3007C1A3EA2003C1A3C003E1A7CA200
1E1A78001F1AF8A26C6CF001F0A26C6CF003E0A26C6CF007C06D180F00011A806C6CF01F
006D60017E187E6D606D6C4C5A6D6C4C5A6D6C4C5AD903F8EE1FC0D901FEEE7F80902600
7F80DA01FEC7FCDA3FE0EC07FCDA0FFCEC3FF0913B03FFC003FFC0020090B6C8FC033F14
FC030714E09226007FFEC9FC50557BC05B>13 D E /Fl 71 123
df<4AB4EB0FE0021F9038E03FFC913A7F00F8FC1ED901FC90383FF03FD907F090397FE0
7F80494801FF13FF4948485BD93F805C137F0200ED7F00EF003E01FE6D91C7FC82ADB97E
A3C648C76CC8FCB3AE486C4A7E007FD9FC3FEBFF80A339407FBF35>11
D<4AB4FC021F13C091387F01F0903901FC0078D907F0131C4948133E494813FF49485A13
7F1400A213FE6F5A163893C7FCAA167FB8FCA33900FE00018182B3AC486CECFF80007FD9
FC3F13FEA32F407FBF33>I<001E130F397F803FC000FF137F01C013E0A201E013F0A300
7F133F391E600F3000001300A401E01370491360A3000114E04913C00003130101001380
481303000EEB070048130E0018130C0038131C003013181C1C7DBE2D>34
D<121EEA7F8012FF13C0A213E0A3127FEA1E601200A413E013C0A312011380120313005A
120E5A1218123812300B1C79BE19>39 D<1430147014E0EB01C0EB03801307EB0F00131E
133E133C5B13F85B12015B1203A2485AA2120F5BA2121F90C7FCA25AA3123E127EA6127C
12FCB2127C127EA6123E123FA37EA27F120FA27F1207A26C7EA212017F12007F13787F13
3E131E7FEB07801303EB01C0EB00E014701430145A77C323>I<12C07E12707E7E121E7E
6C7E7F12036C7E7F12007F1378137CA27FA2133F7FA21480130FA214C0A3130714E0A613
0314F0B214E01307A614C0130FA31480A2131F1400A25B133EA25BA2137813F85B12015B
485A12075B48C7FC121E121C5A5A5A5A145A7BC323>I<121EEA7F8012FF13C0A213E0A3
127FEA1E601200A413E013C0A312011380120313005A120E5A1218123812300B1C798919
>44 D<B512FEA617067F961E>I<121EEA7F80A2EAFFC0A4EA7F80A2EA1E000A0A798919>
I<ED0180ED03C01507A21680150FA216005DA2151E153EA2153C157CA2157815F8A25D14
01A25D1403A25D1407A25D140FA24AC7FCA2141E143EA2143C147CA2147814F8A25C1301
A25C1303A25C1307A25C130FA291C8FC5BA2131E133EA25BA2137813F8A25B1201A25B12
03A25B1207A25B120FA290C9FC5AA2121E123EA2123C127CA2127812F8A25A1260225B7B
C32D>I<EB01FE90380FFFC090383F03F090387C00F849137C48487F48487F4848EB0F80
A2000F15C04848EB07E0A3003F15F0A290C712034815F8A64815FCB3A26C15F8A56C6CEB
07F0A3001F15E0A36C6CEB0FC0A26C6CEB1F80000315006C6C133E6C6C5B017C5B90383F
03F090380FFFC0D901FEC7FC263F7DBC2D>I<EB01C013031307131F137FEA07FFB5FC13
9FEAF81F1200B3B3ACEB7FF0B612F8A31D3D78BC2D>I<EB07FC90383FFF8090B512E039
03F01FF83907C007FC390F0001FE001E6D7E001C1580003CEC7FC05AED3FE01270B4FC6D
EB1FF07FA56C5A6CC7FC120CC813E0153FA216C0157F168015FF16004A5A5D4A5A4A5A5D
4A5A4A5A4AC7FC147E147C5C495A495A495A495A49C71270133E133C5B4914E0485A485A
485A48C7120148B6FCA25A4815C0B7FCA3243D7CBC2D>I<EB07FC90383FFF809038F80F
E03901E003F839078001FCD80F007F000E6D7E001E1580D81F80137F486C14C07FA27F5B
A2121F6C5AC8138015FF1600A24A5AA24A5A5DEC07E04A5A023FC7FCEB1FFCECFF809038
000FE0EC07F86E7E6E7E6E7E1680ED7FC0A216E0153FA216F0A2120C123F487E487EA316
E0A249137F6CC713C01278EDFF807E6C4913006C495A3907C007FC3903F80FF0C6B55A01
3F1380D907F8C7FC243F7CBC2D>I<150E151E153EA2157EA215FE1401A21403EC077E14
06140E141CA214381470A214E0EB01C0A2EB0380EB0700A2130E5BA25B5BA25B5B120148
5A90C7FC5A120E120C121C5AA25A5AB8FCA3C8EAFE00AC4A7E49B6FCA3283E7EBD2D>I<
00061403D80780131F01F813FE90B5FC5D5D5D15C092C7FC14FCEB3FE090C9FCACEB01FE
90380FFF8090383E03E090387001F8496C7E49137E497F90C713800006141FC813C0A216
E0150FA316F0A3120C127F7F12FFA416E090C7121F12FC007015C012780038EC3F80123C
6CEC7F00001F14FE6C6C485A6C6C485A3903F80FE0C6B55A013F90C7FCEB07F8243F7CBC
2D>I<EC1FE0ECFFF8903803F03E90380FC00F90391F000780133E017EEB1FC049133F48
48137F12035B12074848EB3F80ED1F00001F91C7FC5BA2123FA3485AA214FE903887FF80
39FF8F07E090389C01F09038B800FC01B0137E13F0497F16804914C0A2ED1FE0A34914F0
A5127FA6123F6D14E0A2121FED3FC0A26C6C1480A20007EC7F006C6C137E6C6C5B6C6C48
5A90387E07F06DB45A010F1380D903FCC7FC243F7CBC2D>I<1238123C123F90B612FCA3
16F85A16F016E00078C712010070EC03C0ED078016005D48141E151C153C5DC8127015F0
4A5A5D14034A5A92C7FC5C141EA25CA2147C147814F8A213015C1303A31307A3130F5CA2
131FA6133FAA6D5A0107C8FC26407BBD2D>I<EB03FC90381FFF8090387C07E09038F001
F83901E0007C48487F48487F48C7FCED0F80121E16C0003E1407A4123FA26DEB0F807F6C
6C131F6D140001FC133E6C6C5B9038FF80786C6D5A6CEBF3E06CEBFF806C91C7FC133F6D
13C06D7F013F13F801787F48486C7E3903E01FFF48486C1380260F800313C048487E4890
38007FE0003E143F007E141F007CEC0FF01507481403A31501A46C15E0007C1403A2007E
15C06C14076CEC0F806DEB1F006C6C133ED807F05B3901FC03F86CB512E0011F1380D903
FCC7FC243F7CBC2D>I<EB03FCEB1FFF90387E07C09038FC03F048486C7E48486C7E4848
137C000F147E4848137F81003F15805B007F15C0A2151F12FF16E0A516F0A5127F153FA3
6C7EA2001F147F120F6C6C13FF6D13DF000313013900F8039F90387E0F1FD91FFE13E0EB
07F090C7FCA2ED3FC0A41680157FD80F801400487E486C13FEA24A5A5D49485AEB800739
1E000FE0001F495A260FC07FC7FC3803FFFE6C13F838003FC0243F7CBC2D>I<121EEA7F
80A2EAFFC0A4EA7F80A2EA1E00C7FCB3121EEA7F80A2EAFFC0A4EA7F80A2EA1E000A2779
A619>I<121EEA7F80A2EAFFC0A4EA7F80A2EA1E00C7FCB3121E127FEAFF80A213C0A412
7F121E1200A412011380A3120313005A1206120E120C121C5A1230A20A3979A619>I<15
074B7EA34B7EA34B7EA34B7EA34B7E15E7A2913801C7FC15C3A291380381FEA34AC67EA3
020E6D7EA34A6D7EA34A6D7EA34A6D7EA34A6D7EA349486D7E91B6FCA249819138800001
A249C87EA24982010E157FA2011E82011C153FA2013C820138151FA2017882170F13FC00
034C7ED80FFF4B7EB500F0010FB512F8A33D417DC044>65 D<B712FCEEFF8017F0000190
3980000FF86C6CC7EA03FE707E701380EF7FC0EF3FE0A2EF1FF0A218F8A3170F171FA318
F0A2EF3FE0177F18C0EFFF804C1300EE03FCEE0FF8EE7FE091B6C7FC17E091C7EA07FCEE
01FE933800FF80EF7FC0EF3FE0EF1FF018F8170F18FC1707A218FEA718FC170FA2EF1FF8
18F0173FEF7FE0EFFFC00403138048486C90380FFE00B85A17E094C7FC373E7DBD40>I<
DB3FF01306912603FFFE130E020F9038FF801E913A3FF007E03E9139FF8000F8D903FEC7
EA7C7ED907F8EC1EFE4948140FD93FE0140749481403495A91C812014848150012034848
167E5B000F173EA24848161EA2123F5B180E127FA349160012FFAC127F7F180EA2123FA2
7F001F171E181C6C7EA20007173C6D16386C6C1678000117706C6C16F06EEC01E06D6C15
C06D6C1403D90FF0EC07806D6CEC1F00D903FE143E902600FF8013F891393FF007F0020F
B512C0020391C7FC9138003FF037427BBF42>I<B712FCEEFF8017E000019039C0001FF8
6C6C48EB03FEEE00FF717E717EEF0FE084717E717E170184717EA21980187F19C0A3F03F
E0A519F0AB19E0A5F07FC0A21980A218FF19004D5AA24D5A6017074D5A4D5AEF7FC04DC7
FCEE03FE48486CEB1FF8B85A178004FCC8FC3C3E7DBD45>I<B912E0A300019038C00001
6C6C48EB001FEF0FF01703A217011700A31870A41838161CA41800A2163CA2167C16FC15
0391B5FCA3EC80031500167C163CA2161CA21807A3180E93C7FCA4181E181CA2183CA218
7CA218F8170117031707171F48486CEB01FFB912F0A3383E7DBD3E>I<B91280A3000190
38C000036C6C48EB007FEF1FC0170F1707A21703A31701A4EF00E0A21638A31800A31678
A216F81501150791B5FCA3EC8007150115001678A21638A693C8FCAF3801FFE0B612F0A3
333E7DBD3B>I<DB3FE0130C912603FFFE131C021F9038FF803C913A7FF00FC07C9139FF
0001F0D903FC90380078FC4948143DD91FE0141F4948140F4948140701FF15034890C8FC
491501485A000716005B000F177C5B001F173CA2485AA2181C127FA25B95C7FC12FFAB04
1FB512F0127FA26D9139000FFE00EF03FC123FA27F121FA26C7EA212077F12036C7E7F6C
7F6D6C14076D7E6D6C140FD907F8141ED903FEEC3C7C902600FF80EBF83C913A7FF007F0
1C021FB5EAC00C020391C8FC9138003FF03C427BBF47>I<B6D8C01FB512F8A3000101E0
C7383FFC0026007F80EC0FF0B3A691B7FCA30280C7120FB3A92601FFE0EC3FFCB6D8C01F
B512F8A33D3E7DBD44>I<B612F0A3C6EBF000EB3FC0B3B3B2EBFFF0B612F0A31C3E7EBD
21>I<011FB512FCA3D9000713006E5A1401B3B3A6123FEA7F80EAFFC0A44A5A1380D87F
005B007C130700385C003C495A6C495A6C495A2603E07EC7FC3800FFF8EB3FC026407CBD
2F>I<B600C090387FFFFCA3000101E0C7000F138026007F80913807FE0018F818E0604D
5A4DC7FC173E5F5F4C5A4C5A4C5A4C5A4CC8FC163E5E5E4B5A4B5AED07804B7E151F4B7E
4B7E15FF913881EFF8913883C7FCEC878791388F03FE91389E01FF14BCDAF8007F4A6D7E
5C4A6D7E4A6D7EA2707E707EA2707E707EA2707F717E84173F717E717EA2717E84841980
2601FFE04A13C0B600C090B6FCA3403E7DBD47>I<B612F8A3000101E0C9FC38007F80B3
B0EF0380A517071800A45FA35FA25F5F5F4C5A160748486C133FB8FCA3313E7DBD39>I<
B500C093383FFFF0A300016D93387FF800D8007F18E0D977F016EFA3D973F8ED01CFA2D9
71FCED038FA3D970FEED070FA26E150E80A26E6C141CA36E6C1438A26E6C1470A36E6C14
E0A26E6CEB01C0A36E6CEB0380A36E6CEB0700A2037F130EA36F6C5AA26F6C5AA36F6C5A
A25FED07F0A2923803F9C0A36FB45AA26F90C7FCA213F8486C147ED807FFEF3FF8B500F8
013C011FB512F0A34C3E7DBD53>I<B56C91B512F88080D8007F030713006EEC01FC6E6E
5A1870EB77FCEB73FEA2EB71FF01707FA26E7E6E7EA26E7E6E7EA26E7E6E7EA26E7E6E7F
A26F7E6F7EA26F7E6F7EA26F7E6F7EA26F7E6F1380A2EE7FC0EE3FE0A2EE1FF0EE0FF8A2
EE07FCEE03FEA2EE01FF7013F0A2177F173FA2171F170FA2170701F81503487ED807FF15
01B500F81400A218703D3E7DBD44>I<ED7FE0913807FFFE91391FC03F8091397E0007E0
4948EB03F8D907F0EB00FE4948147F49486E7E49486E7E49C86C7E01FE6F7E0001834915
0300038348486F7EA248486F7EA2001F188049167F003F18C0A3007F18E049163FA300FF
18F0AC007F18E06D167FA4003F18C0A26C6CEEFF80A36C6C4B1300A26C6C4B5A00035F6D
150700015F6C6C4B5A6D5E6D6C4A5A6D6C4A5A6D6C4AC7FC6D6C14FED901FCEB03F8D900
7FEB0FE091391FC03F80912607FFFEC8FC9138007FE03C427BBF47>I<B712F8EEFF8017
E000019039C0003FF86C6C48EB07FCEE01FE707EEF7F80EF3FC018E0A2EF1FF0A218F8A8
18F0A2EF3FE0A218C0EF7F80EFFF004C5AEE07FCEE3FF091B612C04CC7FC0280C9FCB3A7
3801FFE0B612C0A3353E7DBD3E>I<B712C016FCEEFF800001D9C00013E06C6C48EB1FF0
EE07FCEE01FE707E84717EA2717EA284A760177F606017FF95C7FCEE01FCEE07F8EE1FE0
EEFF8091B500FCC8FC16F091388001FCED003FEE1FC0707E707E83160383160183A383A4
84A4F0C004190EA28218E0057F131E2601FFE0161CB600C0EB3FF094381FF83805071370
CA3801FFE09438003F803F407DBD43>82 D<D907FC130C90391FFF801C017FEBF03C3901
FC03F83A03F0007E7CD807C0EB1FFC4848130F001F140748C71203003E1401007E1400A2
007C157C12FCA2163CA36C151CA27EA26C6C14007F7FEA3FF8EBFF806C13F86CEBFF806C
14F06C14FC6C14FF6C15C0013F14E0010714F0EB007F020713F89138007FFC150FED07FE
15031501ED00FFA200E0157FA3163FA27EA3163E7E167E6C157C6C15FC6C15F86D13016D
EB03F06DEB07E0D8F9FCEB0FC03AF07F803F8090391FFFFE00D8E00713F839C0007FC028
427BBF33>I<003FB91280A3903AF0007FE001018090393FC0003F48C7ED1FC0007E1707
127C00781703A300701701A548EF00E0A5C81600B3B14B7E4B7E0107B612FEA33B3D7DBC
42>I<B600C090B512F8A3000101E0C70007130026007F80EC01FC715A1870B3B3A4013F
16F06E5DA21701011F5E80010F15036E4A5A010793C7FC6D6C5C6D6C141E6D6C5C027F14
F86E6C485A91390FF00FE00203B51280020049C8FCED1FF03D407DBD44>I<007FB5D8C0
03B512E0A3C649C7EBFC00D93FF8EC3FE06D48EC1F806D6C92C7FC171E6D6C141C6D6C14
3C5F6D6C14706D6D13F04C5ADA7FC05B023F13036F485ADA1FF090C8FC020F5BEDF81E91
3807FC1C163C6E6C5A913801FF7016F06E5B6F5AA26F7E6F7EA28282153FED3BFEED71FF
15F103E07F913801C07F0203804B6C7EEC07004A6D7E020E6D7E5C023C6D7E02386D7E14
784A6D7E4A6D7F130149486E7E4A6E7E130749C86C7E496F7E497ED9FFC04A7E00076DEC
7FFFB500FC0103B512FEA33F3E7EBD44>88 D<B66C0103B51280A3000101F0C8EBF8006C
6C48ED3FC0725A013F041EC7FC6D7E606D6C15386D6C1578606D6C5D6E14016D5E6D6D13
03606E6C49C8FC6E6C5B170E6E6C131E171C6E6C5B6E6C137817706E6C13F06F5B6E1301
6EEB83C05FED7FC7DB3FE7C9FC16EFED1FFE5E150F6F5AB3A4ED1FFC020FB512FCA3413E
7FBD44>I<003FB712F8A391C7EA1FF013F801E0EC3FE00180EC7FC090C8FC003EEDFF80
A2003C4A1300007C4A5A12784B5A4B5AA200704A5AA24B5A4B5AA2C8485A4A90C7FCA24A
5A4A5AA24A5AA24A5A4A5AA24A5A4A5AA24990C8FCA2495A4948141CA2495A495AA2495A
495A173C495AA24890C8FC485A1778485A484815F8A24848140116034848140F4848143F
ED01FFB8FCA32E3E7BBD38>I<486C13C00003130101001380481303000EEB070048130E
0018130C0038131C003013180070133800601330A300E01370481360A400CFEB678039FF
C07FE001E013F0A3007F133FA2003F131F01C013E0390F0007801C1C73BE2D>92
D<EB0FF8EBFFFE3903F01F8039078007E0000F6D7E9038E001F8D81FF07F6E7EA3157F6C
5AEA0380C8FCA4EC1FFF0103B5FC90381FF87FEB7F803801FC00EA07F8EA0FE0485A485A
A248C7FCEE038012FEA315FFA3007F5BEC03BF3B3F80071F8700261FC00E13CF3A07F03C
0FFE3A01FFF807FC3A003FC001F0292A7DA82D>97 D<EA01FC12FFA3120712031201B1EC
03FC91381FFF8091387C07E09039FDE001F09039FFC000FC4A137E91C77E49158049141F
17C0EE0FE0A217F0A2160717F8AA17F0A2160FA217E0161F17C06D1580EE3F006D5C6E13
FE9039F3C001F89039F1E003F09039E0780FC09026C03FFFC7FCC7EA07F82D407EBE33>
I<49B4FC010F13E090383F00F8017C131E4848131F4848137F0007ECFF80485A5B121FA2
4848EB7F00151C007F91C7FCA290C9FC5AAB6C7EA3003FEC01C07F001F140316806C6C13
076C6C14000003140E6C6C131E6C6C137890383F01F090380FFFC0D901FEC7FC222A7DA8
28>I<ED01FC15FFA3150715031501B114FF010713E190381F80F990387E003D49131FD8
03F81307485A49130348481301121F123F5B127FA290C7FCA25AAA7E7FA2123FA26C7E00
0F14037F000714076C6C497E6C6C497ED8007C017913F890383F01F190380FFFC1903A01
FE01FC002D407DBE33>I<EB01FE90380FFFC090383F03F09038FC01F848486C7E484813
7E48487F000F158049131F001F15C04848130FA2127F16E090C7FCA25AA290B6FCA290C9
FCA67EA27F123F16E06C7E1501000F15C06C6C13036DEB07806C6C1400C66C131E017E5B
90381F80F8903807FFE0010090C7FC232A7EA828>I<EC1FC0EC7FF8903801F83C903807
E07E90380FC0FFEB1FC1EB3F811401137FEC00FE01FE137C1500AEB6FCA3C648C7FCB3AE
487E007F13FFA320407EBF1C>I<167C903903F801FF903A1FFF078F8090397E0FDE1F90
38F803F83803F001A23B07E000FC0600000F6EC7FC49137E001F147FA8000F147E6D13FE
00075C6C6C485AA23901F803E03903FE0FC026071FFFC8FCEB03F80006CAFC120EA3120F
A27F7F6CB512E015FE6C6E7E6C15E06C810003813A0FC0001FFC48C7EA01FE003E140048
157E825A82A46C5D007C153E007E157E6C5D6C6C495A6C6C495AD803F0EB0FC0D800FE01
7FC7FC90383FFFFC010313C0293D7EA82D>I<EA01FC12FFA3120712031201B1EC01FE91
3807FFC091381E07E091387803F09138E001F8D9FDC07F148001FF6D7E91C7FCA25BA25B
B3A6486C497EB5D8F87F13FCA32E3F7DBE33>I<EA01E0EA07F8A2487EA46C5AA2EA01E0
C8FCACEA01FC127FA3120712031201B3AC487EB512F0A3143E7DBD1A>I<EA01FC12FFA3
120712031201B292B51280A392383FFC0016E0168093C7FC153C5D5D4A5AEC07C04A5A4A
C8FC143E147F4A7E13FD9038FFDFC0EC9FE0140F496C7E01FC7F496C7E1401816E7E8182
6F7E151F826F7EA282486C14FEB539F07FFFE0A32B3F7EBE30>107
D<EA01FC12FFA3120712031201B3B3B1487EB512F8A3153F7DBE1A>I<2701F801FE14FF
00FF902707FFC00313E0913B1E07E00F03F0913B7803F03C01F80007903BE001F87000FC
2603F9C06D487F000101805C01FBD900FF147F91C75B13FF4992C7FCA2495CB3A6486C49
6CECFF80B5D8F87FD9FC3F13FEA347287DA74C>I<3901F801FE00FF903807FFC091381E
07E091387803F000079038E001F82603F9C07F0001138001FB6D7E91C7FC13FF5BA25BB3
A6486C497EB5D8F87F13FCA32E287DA733>I<14FF010713E090381F81F890387E007E01
F8131F4848EB0F804848EB07C04848EB03E0000F15F04848EB01F8A2003F15FCA248C812
FEA44815FFA96C15FEA36C6CEB01FCA3001F15F86C6CEB03F0A26C6CEB07E06C6CEB0FC0
6C6CEB1F80D8007EEB7E0090383F81FC90380FFFF0010090C7FC282A7EA82D>I<3901FC
03FC00FF90381FFF8091387C0FE09039FDE003F03A03FFC001FC6C496C7E91C7127F49EC
3F805BEE1FC017E0A2EE0FF0A3EE07F8AAEE0FF0A4EE1FE0A2EE3FC06D1580EE7F007F6E
13FE9138C001F89039FDE007F09039FC780FC0DA3FFFC7FCEC07F891C9FCAD487EB512F8
A32D3A7EA733>I<02FF131C0107EBC03C90381F80F090397F00387C01FC131CD803F813
0E4848EB0FFC150748481303121F485A1501485AA448C7FCAA6C7EA36C7EA2001F14036C
7E15076C6C130F6C7E6C6C133DD8007E137990383F81F190380FFFC1903801FE0190C7FC
AD4B7E92B512F8A32D3A7DA730>I<3901F807E000FFEB1FF8EC787CECE1FE3807F9C100
031381EA01FB1401EC00FC01FF1330491300A35BB3A5487EB512FEA31F287EA724>I<90
383FC0603901FFF8E03807C03F381F000F003E1307003C1303127C0078130112F81400A2
7E7E7E6D1300EA7FF8EBFFC06C13F86C13FE6C7F6C1480000114C0D8003F13E0010313F0
EB001FEC0FF800E01303A214017E1400A27E15F07E14016C14E06CEB03C0903880078039
F3E01F0038E0FFFC38C01FE01D2A7DA824>I<131CA6133CA4137CA213FCA21201120312
07001FB512C0B6FCA2D801FCC7FCB3A215E0A912009038FE01C0A2EB7F03013F13809038
1F8700EB07FEEB01F81B397EB723>I<D801FC14FE00FF147FA300071403000314010001
1400B3A51501A31503120015076DEB06FF017E010E13806D4913FC90381FC078903807FF
E00100903880FE002E297DA733>I<B539E00FFFE0A32707FE000313006C48EB00FC5E00
015D7F00005DA26D13016D5CA26D6C485AA2ECC007011F91C7FCA290380FE00EA2ECF01E
0107131CA26D6C5AA2ECFC7801011370A2ECFEF001005BA2EC7FC0A36E5AA26EC8FCA314
0E2B287EA630>I<B53BC3FFFE03FFF8A3290FFE003FE00013C06C486D48EB3F806C4817
006D010F141E00016F131C15076D163C00004A6C1338A2017F5E4B7E151DD93F805DED3D
FC1538D91FC04A5AED78FE9238707E03D90FE0017F5BEDE03F02F0140701070387C7FC91
38F1C01F02F9148F010315CE9138FB800F02FF14DE6D15FCED00076D5DA24A1303027E5C
A2027C1301023C5C023813003D287EA642>I<B539F01FFFE0A30003D9C00F1300C69038
8007F8D97F0013E002805BD93FC05B011F49C7FC90380FE00EECF01E6D6C5A01035B6D6C
5A6E5AEB00FF6E5A6E5A81141F814A7E81147BECF1FC903801E1FEECC0FF01037F49486C
7ED90F007F011E6D7E013E130F496D7E01FC80486C80000F4A7EB539803FFFF8A32D277F
A630>I<B539E00FFFE0A32707FE000313006C48EB01FC6F5A00015D7F00005DA2017F49
5AA2EC8003013F5CA26D6C48C7FCA26E5A010F130EA26D6C5AA2ECF83C01031338A26D6C
5AA2ECFEF001005BA2EC7FC0A36E5AA36EC8FCA2140EA2141E141C143C1438A214780018
1370127EB45BA2495AA248485AD87E07C9FCEA780EEA3C3CEA1FF8EA07E02B3A7EA630>
I<001FB61280A2EBE0000180140049485A001E495A121C4A5A003C495A141F00385C4A5A
147F5D4AC7FCC6485AA2495A495A130F5C495A90393FC00380A2EB7F80EBFF005A5B4848
13071207491400485A48485BA248485B4848137F00FF495A90B6FCA221277EA628>I
E /Fm 23 122 df<121EEA7F8012FF13C0A213E0A3127FEA1E601200A413E013C0A31201
1380120313005A1206120E5A5A5A12600B1D78891B>44 D<143014F013011303131F13FF
B5FC13E713071200B3B3B0497E497E007FB6FCA3204278C131>49
D<EB03FE90381FFFC0017F13F03901F80FFC3903C001FE48486C7E000EC7EA7F8048EC3F
C0ED1FE04815F00030140F007015F800601407126CB415FC7F7F1503A46C4813076CC7FC
C8FC16F8A2150F16F0151F16E0A2ED3FC0ED7F8016005D5D4A5A4A5A4A5A5D4A5A4A5A4A
C7FC147C5C5C495A495A495A49C7120C131E5B013814185B5B485A4848143848C8123000
0E1570001FB612F0A25A5AB712E0A326427BC131>I<EC07FCEC3FFF91B512C0903903FC
03E0903907E000F0D91FC0133849C71258017EEB01FC01FE1303491307485A485AA24848
EB03F8000FEC01F092C7FC485AA3485AA3127FA29038007F80903801FFF090380780FC39
FF0E003E49EB1F8049EB0FC049EB07E0136001E0EB03F04914F8150116FC5BED00FEA390
C812FFA47EA57F123FA216FE121F15016D14FC120FED03F86C7EED07F06C6C14E06C6CEB
0FC06C6CEB1F80017EEB3F0090383F80FE90380FFFF8010313E00100138028447CC131>
54 D<14FF010713E0011F13F890387F80FC9038FC007E48487F4848EB1F804848EB0FC0
000FEC07E0485AED03F0485A16F8007F140190C713FCA25AA216FE1500A516FFA46C5CA3
6C7E5D121F7F000F5C6C6C1306150E6C6C5B6C6C5BD8007C5B90383F01E090390FFF80FE
903801FE0090C8FC150116FCA4ED03F8A216F0D80F801307486C14E0486C130F16C0ED1F
80A249EB3F0049137E001EC75A001C495A000F495A3907E01FE06CB51280C649C7FCEB1F
F028447CC131>57 D<B912F0A3000101C0C7127F6C6C48EC0FF817031701170018781838
A2181CA3180CA4180E1806160CA21800A5161CA2163C167CED01FC91B5FCA3EC8001ED00
7C163C161CA2160CA793C8FCB08048487EB612F8A337447CC340>70
D<B6D8C003B6FCA3000101E0C70007138026007F80913801FE00B3A991B7FCA30280C712
01B3AC2601FFE0913807FF80B6D8C003B6FCA340447CC349>72 D<010FB512FEA3D90003
13806E130080B3B3AB123F487E487EA44A5A13801300006C495A00705C6C13076C5C6C49
5A6CEB1F802603E07FC7FC3800FFFCEB1FE027467BC332>74 D<B712FCEEFFC017F80001
9039C0000FFC6C6C48EB01FF9338007F80EF1FE0170FEF07F018F8EF03FCA218FE1701A2
18FFA718FEA2170318FCA2EF07F818F0EF0FE0EF1FC0EF7F80933801FE00EE0FFC91B612
F017800280C9FCB3AA3801FFE0B612C0A338447CC342>80 D<EB07FC90383FFF809038F8
0FE03903C003F048C66C7E000E6D7ED80FC0137E486C137F6D6D7EA36F7EA26C5AEA0380
C8FCA4EC0FFF49B5FC90380FFE1FEB3FC0EBFF00EA03FC485A485A485A485A127F5B1760
48C7FCA3153FA36D137F007F14EF6D9038C7E0C0003F13013A1FE00783F13B07F81E03FF
802701FFFC0113003A001FE0007C2B2E7CAC31>97 D<EC7F80903803FFF090380FC07C90
383F000F01FCEB03804848EB01C00003140F4848EB1FE049133F120F485AA2485AED1FC0
007FEC070092C7FCA290C9FC5AAB7E7FA2123F16307F001F15706C6C146016E06C6C14C0
6C6C13010001EC03806C6CEB0700013F131E90381FC078903807FFF001001380242E7DAC
2B>99 D<EB01FE903807FFC090381F03F090387E00FC49137E48487F485A4848EB1F8000
0F15C049130F121F484814E01507A2007F15F090C7FCA25AA390B6FCA290C9FCA67EA27F
A2123F16306C7E1670000F15606D14E06C6C14C0000314016C6CEB03806C6CEB0700013E
131E90381F80F8903803FFE0010090C7FC242E7DAC2B>101 D<EC0FE0EC7FF8903801F8
1E903803F03F90390FE07F8090381FC0FF5C133F495AA2ED7F0001FE131C92C7FCAFB67E
A3C648C8FCB3B2486C7E007F13FFA321467EC51E>I<EE0F80D901FCEB7FE0903A0FFF81
F0F090393F07E3819039FC01FF033A01F800FE014848017E13E00007027FC7FC497F000F
8149131F001F81A9000F5D6D133F000792C7FC6D5B0003147E6C6C5B6D485A3903BF07E0
90380FFF80260701FCC8FC90CAFCA25AA37F6C7E7F90B512F86C14FF16E06C15F86C6C80
48B67E3A07C0000FFF48481300003FC8EA3F80003E151F48ED0FC0A2481507A56C150F00
7C1680007E151F003E16006C153E6C6C5CD807E0495AD801F8EB07E0D8007FEB3F809026
1FFFFEC7FC010113E02C427DAC31>I<EA01FC12FFA3120712031201B3EC01FE913807FF
C091381E07F091383801F802707FECE000D9FDC07F5C01FF147F91C7FCA25BA35BB3A848
6CECFF80B5D8F83F13FEA32F457DC436>I<EA01E0EA07F8A2487EA46C5AA2EA01E0C8FC
ADEA01FC12FFA3120712031201B3B0487EB512F8A315437DC21C>I<D801FC01FFEC1FE0
00FF010701E0EBFFFC913B0F03F801E07F913C3C01FC07803F800007903C7000FE0E001F
C0000349D97E1C130F2601FDC0D97F38804A143001FFDA3FF06D7E91C75BA2495DA3495D
B3A8486C4A6C497EB5D8F81FB50003B512E0A34B2C7DAB52>109
D<3901FC01FE00FF903807FFC091381E07F091383801F8000701707F0003EBE0002601FD
C07F5C01FF147F91C7FCA25BA35BB3A8486CECFF80B5D8F83F13FEA32F2C7DAB36>I<EC
7F80903803FFF090380FC0FC90383E001F496D7E496D7E48486D7E48486D7E48486D7E00
0F81A24848147E003F157FA290C87E481680A44816C0AA6C1680A26D147F003F1600A200
1F157E6D14FE000F5D6D130100075D6C6C495A6C6C495A6C6C495A013E49C7FC90381FC0
FE903807FFF89038007F802A2E7DAC31>I<3903F803F000FFEB1FFCEC3C3EEC707F0007
EBE0FF3803F9C000015B13FBEC007E153C01FF13005BA45BB3A748B4FCB512FEA3202C7D
AB26>114 D<1306A5130EA4131EA3133E137EA213FE12011207001FB512F0B6FCA2C648
C7FCB3A4150CAA017E131C017F1318A26D133890381F8030ECC070903807E0E0903801FF
C09038007F001E3E7EBC26>116 D<D801FC147F00FFEC3FFFA300071401000380000181
B3A85EA35DA212006D5B017E9038077F80017F010E13C06D011C13FE90380FC078903803
FFF09026007F8013002F2D7DAB36>I<B539F001FFFCA3000790C7EA7FE06C48EC1F8000
011600160E0000150C6D141C6D1418A26E1338013F1430A26D6C5BA26E13E0010F5CA26D
6C485AA2ECF803010391C7FCA2903801FC06A2ECFE0E0100130CA2EC7F18A215B8EC3FB0
A2EC1FE0A36E5AA26E5AA36EC8FCA21406A35CA25CA2123C007E5BB4FC5CA25CEAFE0138
7C0380D87007C9FCEA3C1EEA0FFCEA03F02E3F7EAA33>121 D E
/Fn 20 118 df<EE3FF0923803FFFE031F6D7E92397FC01FC0913A01FE0003E0DA07F8EB
00F04A4814784A48804A48EB01FC4A48EB07FE4AC7FC4948140F13035C13075C715A010F
6F5A4AEC00E095C8FCB3EF03FEB9FCA426000FF0C7120F1703A21701B3B3AD496C4A7E49
6C4A7F003FB5D8FC07B61280A441657EE448>12 D<BB12FCA4C601FCC8120FD93FF89238
007FFE011F171F190719031900A21A7E1A3EA21A1EA21A1F86A486A6F20380A318E0A297
C7FCA61701A417031707170F171F17FF91B7FCA402F8C7FC171F170F170717031701A417
00A895C9FCB3A580133F90B57EB712E0A4496279E156>70 D<B7020FB612F0A4C691C900
0FEBF000D93FFC040313C06D48705BB3B3A391BAFCA402F8C91201B3B3A7496C4C7F90B5
040F13F0B7020FB612F0A4546279E163>72 D<B712E0A4C60280CAFCD93FFCCBFC131F5C
B3B3B21A1CA61A3C1A38A61A78A41AF8A21AF01901A219031907A2190F191F193F197FF0
01FF1807013F043F13E0D9FFFC0203B5FCBBFCA4466279E153>76
D<B912C018FEF0FFC019F0C601FCC813FCD93FF8ED0FFF011F04037F06007FF13FF0737E
737E1907737E86731380A27313C0A31BE01A7FA21BF0A91BE0A21AFF1BC0A34F13801B00
614F5A624F5A4F5AF17FE04F5A060390C7FCF01FFE943801FFF891B812E096C8FC18F802
F8CCFCB3B3A4497E90B5FCB7FCA44C6279E15A>80 D<DA07FF1403023F01F05B49B512FC
010702FF5B90260FFC0013C0D93FE090380FF01FD97F80EB03F801FEC86C5A4848157E48
48ED1F7F48486F5A4848815B001F824981003F8290CAFC4883A2007E83A212FE84A384A2
7EA36D82A26C7EA26D93C7FC6C7E7F7F6C7E6D7E6C13E06C13FCECFFC06C14F86CECFF80
6C15F86DECFF80011F15E06D15F8010315FE01006F7E021F81020181DA003F80030380DB
003F7F04037FEE007FEF1FFF71138017037113C083A2F07FE0183FA2181F00E018F0180F
A41807A27EA47E19E0180F7E19C07E6C171F19806D163F6D17006D5E6D16FE486C5E6D4B
5AD8FC7F1503D91F80EC0FF026F80FE04A5AD907FCEC7F8029F001FFE003FFC7FC6D6CB5
12FC48011F14F0020314C0489026001FFEC8FC3C667AE349>83 D<EC3FF0903803FFFE01
0F6D7E90393FC03FE090397E0007F801F86D7ED801E06D7E48486D7E48486E7E48C86C7E
7F01F06E7E487E6D6E7EA3707EA36C5AEA03E0C9FCA6167FED7FFF020FB5FC91387FF807
903801FF80903807FC00EB1FF0EB7FC0495AD803FEC7FC485A120F5B485A485AA2484817
E0A312FF5BA2160FA3161F6D141B007F153B16736D913971FC01C06C6C14E1001FEC01C1
D80FFC903A0780FE03806C6C903A0F00FF07002701FF807E6DB4FC27007FFFF86D5A011F
01E0EB1FF8010190C7EA07E03B417ABF42>97 D<4AB47E020F13F8023F13FE9139FF007F
80D903FCEB07E0D907F0EB01F0D91FE0EB007849488049488049C87E48485D4915FF0003
4B138048485CA2485AA2485AA2003F6F130049EC007C94C7FC127FA35B12FFAD127F7FA4
123F7FA2001FEE01C07F000F16036D168012076C6C15076D160000015E6C6C151E6D6C5C
6D6C5C6D6C5CD90FF8495AD903FCEB07C0903A00FF803F8091263FFFFEC7FC020F13F802
01138032417CBF3A>99 D<EC03FE91381FFFE091B512F8903901FE03FE903A07F0007F80
49486D7ED93FC06D7E49C76C7E496E7E49140348488148481401000782491400000F8283
485A1880123F49153FA2007F17C0A35BA212FF90B8FCA30180CAFCA9127F7FA3123FA27F
121FEF01C06C7E17036C6C1680A26C6C15070001EE0F006D150E6C6C151E6D6C5C6D6C5C
6D6C5CD907F0EB03E0D903FC495A902700FF803FC7FC91383FFFFC020F13F00201138032
417CBF3A>101 D<ED0FF0ED7FFC4AB5FC913907F81F8091390FE00FC091381FC03F9139
3F807FE0EC7F005C495A5C0103EC3FC0A24948EB0F0093C7FCA2495AB3A5B712F0A42600
0FF0C8FCB3B3B0497EEB3FFE003FB6FCA42B657EE428>I<F03F80DA03FC903801FFE091
273FFFC00713F091B539F01FC1F8903B03FC03FC3E03903A07F000FE784948EB7FE04948
EB3FC04948011FEB01F049C76C6CC7FC01FE6E7EA248486E7EA2000382A2491401000782
AA00035E6D1403A200015EA26C6C4A5AA2017F4A5A6D6C495A6D6C495A496C49C8FCD937
F013FE903973FC03FC0160B512F0D9E03F13C0DA03FCC9FC4848CBFCA57FA27FA27F6C7E
13FF91B512FE6DECFFF06D15FE6D6F7E6D16E084013F16FC01FEC700017FD803F8EC001F
D807E0ED03FF4848030013804848167F003FEF3FC090CA121F127EF00FE012FE481707A6
6C170F007E18C0A2007F171F6C6CEE3F806C6CEE7F00000F177ED807F04B5A6C6C4B5A6C
6C4B5AD8007FED1FC0D93FE0ECFF80D90FFED90FFEC7FC0101B612F0D9003F1480020101
F0C8FC3D5E7DBF42>I<EB03C0EA07FFB5FCA41201EA007FA2133FB3AAEE7FE0923803FF
FC030F13FFDB3F0013C00378EB1FE04B6D7EDAC1C06D7EDAC3808002C7C7120302CE8117
0114DC14D802F86E7E5CA35CA35CB3B3496C4A7F496C4A7FB6D8F003B612C0A442647DE3
49>I<133C13FF487F487FA66C5B6C90C7FC133C90C8FCB3A2EB03C0EA07FF127FA41201
EA007FA2133FB3B3AC497E497EB612E0A41B5F7DDE23>I<D903C0D9FFC0EC07FED807FF
010301F891381FFFC0B5010F01FE027F13F0923D3F00FF8001F807FC0378903B3FC003C0
01FEDAC1E090261FE00FC77E0001D9C3C090260FF01E6E7ED8007F49902607F81C6E7E02
C7C75CD93FCE6E6C486E7E02CC166002DC16E002D85E02F8DA01FF6F7E4A5EA24A93C8FC
A44A5DB3B3496C4A6C4B7E496C4A6D4A7EB6D8F007B6D8803FB512FCA4663F7CBE6F>
109 D<D903C0EB7FE0D807FF903803FFFCB5010F13FFDB3F0013C00378EB1FE04B6D7E00
01D9C1C06D7E27007FC3808002C7C71203D93FCE81170114DC14D802F86E7E5CA35CA35C
B3B3496C4A7F496C4A7FB6D8F003B612C0A4423F7DBE49>I<EDFF80020F13F8023F13FE
9139FF007F80D903FCEB1FE0D907F0EB07F0D90FC0EB01F8D93F80EB00FE49C8127F017E
81496F7E48486F7E00038349150700078348486F7EA2001F83491501A2003F83A348486F
7EA400FF1880AC007F1800A26D5DA2003F5FA36C6C4B5AA36C6C4B5A00075FA26C6C4B5A
6C6C4B5AA26C6C4B5A017F4BC7FC6D6C14FE6D6C495AD90FF0EB07F8D903FCEB1FE0D900
FFEB7F806EB5C8FC020F13F8020113C039417CBF42>I<D903C0EB7FC0D807FF903807FF
FCB5011F13FFDB7F0013C003F8EB1FF0DAC3E0EB07F80001D9C7806D7E26007FCFC76C7E
02DE6E7ED93FFC6F7E4A6F7E4A82181F4A82727E5C727EA2727EA3727EA41A8084AC4E13
00A54E5AA2611807A24E5A6E5E181F6E4B5A6E5E187F6E4B5A02DE4A90C7FC02CF4A5ADA
C780495ADAC3C0EB0FF0DAC1F0EB3FE0913AC07E01FF806FB448C8FC030F13F803001380
93CAFCB3A3497E497EB612F0A4415B7DBE49>I<9039078003F8D807FFEB0FFFB5013F13
C092387C0FE0913881F01F9238E03FF00001EB838039007F8700148FEB3F8E029CEB1FE0
EE0FC00298EB030002B890C7FCA214B014F0A25CA55CB3B0497EEBFFF8B612FCA42C3F7C
BE33>114 D<1438A71478A414F8A31301A31303A21307130F131FA2137F13FF1203000F
90B6FCB8FCA3260007F8C8FCB3AE17E0AE6D6CEB01C0A316036D6C148016076D6C14006E
6C5A91383FC01E91381FF07C6EB45A020313E09138007F802B597FD733>116
D<D903C0150FD807FFED1FFFB50203B5FCA40001ED0007D8007F1501A2013F81B3B25FA3
5FA35F011F15066E140E5F130F6E4A7F01075D6D6C494813E0D901FE4948EBFFC0903A00
FFC01F8091393FFFFE00020F13F8020001C0EC800042407DBE49>I
E /Fo 5 85 df<1A1E1A1F6262A262A261A26161A2618761A26161197B19FB19F3F001E3
A2F003C318071983180F1903061E80A2183C85187818F818F0EF01E0A2EF03C0A2EF0780
170F1800171E875FA24D7F17F85F4C5AA24C5AA24C5A160F94C8FC5E161E4C82A25E04F8
157F5E15015E4BB8FCA25DA24BC9127F5D151E4B83A25D1A3F5D14015D4A5AA24A5AA24A
CAFC5C141E5C875C14F81A1F495A13031307010F183F131FD97FF84D7E2603FFFE0403B5
7E007FD9FFE092B7FC4E1680B61A006C5C596678E568>65 D<92B912F04A18FEF3FFC06E
19F0DB007F90C700017F70489138003FFE7048ED0FFF043F04037F757F4D6F7F767E047F
173F767E4D707EA204FF717EA24D707EA24B1A80885FA24B1AC0A25F885D1EE094CBFCA2
5D645EA2151FA25EA2153F645E1EC0157FA24C5FA215FF1E804C5FA25C1E004C5FA24A62
A24C173F655C525A93CBFCA24A4F5AA24B4D5BA2021F62515B5D5190C7FC023F611B0F4B
4D5A64027F183F515A4B60515A02FF4D5B5090C8FC4B4C5A1A0F49F01FF8505A4B4C5A50
5A494D5B070790C9FC4BED1FFC4F5A49933801FFE04904071380013FDC7FFECAFC007FB9
12F8BA12E096CBFC18F0636276E16A>68 D<92BB12FC5CA280DB007F90C8120F70481500
7048EE3FF8043F170F1C074D1603A2167F1C014D17F0A216FFA25FA25D1DE05FA25DA25F
1C034B19C0A294CAFC1AE04B4B6C14805090C7FC5EA2031F1503625E1907153F624C140F
191F157F077FC9FC4C5C180F92B8FC61A34A9038E0000FF001FC4C1300A25C19785E19F8
5C6193C8FCA24A1501615DA2021F5E95CBFC5DA2143FA25DA2147FA25DA214FFA25DA25B
A25DA25BA25DA25B5B013F13F0007FB612FEB7FCA35E6276E15C>70
D<92B812FCF2FFC04A18F86E18FEDB007F90C7383FFF80704802037F7048020013F0043F
EE3FF8757E4D6F7E1B07047F837513805F1DC016FFA25F1DE05DA25FA25D5113C05FA25D
51138094C9FC1D004B5F644C4C5AA2031F4D5A644C4C5A505B033F4C5B5048C7FC4C4B5A
F23FF0037F4C5A963801FF804CDA0FFEC8FCF1FFF892B812C04FC9FC619339E00003FF4A
9238007FC0737E4C6E7E737E4A1607864C8119034A83A293C8FCA24A84A25DA2021F5EA2
4B94C8FCA2023F5EA25DA2027F5EA25DA202FF5E625DA2491BE01C015DA2491A031DC04B
18071D80491A0F49051F1500013F01E060007FB600F0020F143EB76F6C5B735C4C6EEB83
F0CD6CB45A081F1380E003FEC7FC5B6576E166>82 D<017FBB12FC1CFE90BCFCA292C727
7FFC000113FC4801F06E48EB001F0280027F150791C81603D803FC4C14015B4903FF16F8
49190000075F5B5E48481AF06090C8FC484B1601A2001E5F003E1BE0003C5DA2007C94C8
FC00781A034C17C012F8485EA2161F481B80C94992C7FCA2163FA25FA2167FA25FA216FF
A25FA25DA25FA25DA25FA25DA294CBFCA25DA25EA2151FA25EA2153FA25EA2157FA25EA2
15FFA25EA25CA25EA25CA25EA25CA293CCFC5CA25C49B512E0001FB8FC5AA25F576166E0
64>84 D E end
%%EndProlog
%%BeginSetup
%%Feature: *Resolution 600dpi
TeXDict begin

%%EndSetup
%%Page: 0 1
0 0 bop 1597 1915 a Fo(D)50 b(R)h(A)f(F)g(T)1194 2098
y Fn(High)45 b(P)l(erformance)e(F)-11 b(ortran)1291 2281
y(Language)43 b(Sp)t(eci\014cation)1234 2670 y Fm(High)32
b(P)m(erformance)h(F)-8 b(ortran)31 b(F)-8 b(orum)1611
2922 y(Jan)m(uary)33 b(2,)f(1996)p eop
%%Page: 1 2
1 1 bop 3725 -200 a Fl(i)332 2911 y(This)37 b(is)h(the)h(result)f(of)i
(a)f(LaT)-8 b(eX)40 b(run)e(of)h(a)g(draft)g(of)g(a)h(single)d(c)m
(hapter)j(of)f(the)g(HPFF)h(Final)150 3024 y(Rep)s(ort)30
b(do)s(cumen)m(t.)357 4934 y(c)332 4937 y Fk(\015)p Fl(1992)k(Rice)f
(Univ)m(ersit)m(y)-8 b(,)33 b(Houston)f(T)-8 b(exas.)48
b(P)m(ermission)31 b(to)i(cop)m(y)h(without)d(fee)i(all)f(or)g(part)h
(of)150 5050 y(this)c(material)h(is)f(gran)m(ted,)j(pro)m(vided)d(the)h
(Rice)g(Univ)m(ersit)m(y)g(cop)m(yrigh)m(t)h(notice)f(and)g(the)h
(title)f(of)g(this)150 5163 y(do)s(cumen)m(t)g(app)s(ear,)g(and)g
(notice)h(is)e(giv)m(en)h(that)h(cop)m(ying)g(is)e(b)m(y)h(p)s
(ermission)e(of)i(Rice)h(Univ)m(ersit)m(y)-8 b(.)p eop
%%Page: 2 3
2 2 bop 150 763 a Fj(Con)-6 b(ten)g(ts)286 1208 y Fl(0.1)94
b(Mapping)30 b(Inquiry)e(Pro)s(cedures)90 b Fi(:)46 b(:)g(:)f(:)h(:)g
(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)
g(:)f(:)h(:)184 b Fl(1)495 1321 y(0.1.1)106 b(New)31
b(in)e(HPF)i(2.0)84 b Fi(:)46 b(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)f(:)h(:)g
(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)
184 b Fl(1)495 1433 y(0.1.2)106 b(HPF)p 980 1433 28 4
v 33 w(ALIGNMENT\(ALIGNEE,)22 b(LB,)e(UB,)h(STRIDE,)f(AXIS)p
3049 1433 V 33 w(MAP)-8 b(,)21 b(IDEN-)786 1546 y(TITY)p
1024 1546 V 32 w(MAP)-8 b(,)32 b(D)m(YNAMIC,)g(NCOPIES\))24
b Fi(:)46 b(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f
(:)h(:)184 b Fl(1)495 1659 y(0.1.3)106 b(HPF)p 980 1659
V 33 w(TEMPLA)-8 b(TE\(ALIGNEE,)21 b(TEMPLA)-8 b(TE)p
2551 1659 V 32 w(RANK,)21 b(LB,)g(UB,)g(AXIS)p 3468 1659
V 32 w(TYPE,)786 1772 y(AXIS)p 1011 1772 V 63 w(INF)m(O,)31
b(NUMBER)p 1770 1772 V 34 w(ALIGNED,)g(D)m(YNAMIC\))90
b Fi(:)45 b(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)184 b Fl(3)495
1885 y(0.1.4)106 b(HPF)p 980 1885 V 33 w(DISTRIBUTION\(DISTRIBUTEE,)39
b(AXIS)p 2662 1885 V 32 w(TYPE,)h(AXIS)p 3237 1885 V
32 w(INF)m(O,)786 1998 y(PR)m(OCESSORS)p 1407 1998 V
51 w(RANK,)20 b(PR)m(OCESSORS)p 2393 1998 V 31 w(SHAPE,)g(PLB,)g(PUB,)h
(PSTRIDE\))95 b(5)495 2111 y(0.1.5)106 b(MAP)p 1004 2111
V 33 w(ARRA)-8 b(Y\(DISTRIBUTEE,)31 b(DIM\))51 b Fi(:)45
b(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)184
b Fl(8)495 2224 y(0.1.6)106 b(BLOCK)p 1120 2224 V 32
w(SIZES\(DISTRIBUTEE,)29 b(DIM\))85 b Fi(:)46 b(:)g(:)f(:)h(:)g(:)g(:)f
(:)h(:)g(:)f(:)h(:)g(:)g(:)f(:)h(:)184 b Fl(8)84 5438
y @beginspecial @setspecial
 -3 0 moveto 3 0 lineto 3 -720 lineto -3 -720 lineto closepath 1 setgray
fill
 
@endspecial 3934 92 a Fh(1)3934
205 y(2)3934 318 y(3)3934 431 y(4)3934 544 y(5)3934 657
y(6)3934 770 y(7)3934 882 y(8)3934 995 y(9)3919 1108
y(10)3919 1221 y(11)3919 1334 y(12)3919 1447 y(13)3919
1560 y(14)3919 1673 y(15)3919 1786 y(16)3919 1899 y(17)3919
2012 y(18)3919 2124 y(19)3919 2237 y(20)3919 2350 y(21)3919
2463 y(22)3919 2576 y(23)3919 2689 y(24)3919 2802 y(25)3919
2915 y(26)3919 3028 y(27)3919 3141 y(28)3919 3254 y(29)3919
3366 y(30)3919 3479 y(31)3919 3592 y(32)3919 3705 y(33)3919
3818 y(34)3919 3931 y(35)3919 4044 y(36)3919 4157 y(37)3919
4270 y(38)3919 4383 y(39)3919 4496 y(40)3919 4609 y(41)3919
4721 y(42)3919 4834 y(43)3919 4947 y(44)3919 5060 y(45)3919
5173 y(46)3919 5286 y(47)3919 5399 y(48)p eop
%%Page: 1 4
1 3 bop 150 -200 a Fg(0.1.)72 b(MAPPING)31 b(INQUIR)-8
b(Y)31 b(PR)m(OCEDURES)1792 b Fl(1)150 99 y Ff(0.1)97
b(Mapping)32 b(Inquiry)g(Pro)s(cedures)150 302 y Fl(Revised)e(Jan)g(2,)
h(1996,)h(RSS.)150 547 y Ff(0.1.1)97 b(New)34 b(in)e(HPF)h(2.0)150
719 y Fl(Changes:)261 908 y(1.)46 b(Remo)m(v)m(e)32 b(the)f(stricture)f
(against)g(structure)g(comp)s(onen)m(ts.)261 1097 y(2.)46
b(Add)30 b(new)g(DISTRIBUTION)f(t)m(yp)s(e:)41 b(INDIRECT.)261
1286 y(3.)46 b(Add)30 b(in)m(uiry)e(functions)h(MAP)p
1450 1286 28 4 v 33 w(ARRA)-8 b(Y)31 b(and)f(BLOCK)p
2350 1286 V 32 w(SIZES)261 1475 y(4.)46 b(Add)22 b(LB,)h(UB,)h(and)e
(STRIDE)f(optional)h(argumen)m(ts)h(to)h(DISTRIBUTION)d(to)j(handle)d
(sections)377 1588 y(of)31 b(pro)s(cessors)f(arrangemen)m(ts)h(in)e
(ONTO)g(clause.)150 1833 y Ff(0.1.2)97 b(HPF)p 639 1833
30 4 v 36 w(ALIGNMENT\(ALIGNEE,)43 b(LB,)f(UB,)g(STRIDE,)g(AXIS)p
2735 1833 V 36 w(MAP)-8 b(,)43 b(IDENTITY)p 3492 1833
V 34 w(MAP)-8 b(,)448 1949 y(D)m(YNAMIC,)34 b(NCOPIES\))423
2121 y Fe(Optional)22 b(Argumen)m(ts.)37 b Fd(LB)p Fl(,)20
b Fd(UB)p Fl(,)g Fd(STRIDE)p Fl(,)f Fd(AXIS)p 2225 2121
29 4 v 33 w(MAP)p Fl(,)h Fd(IDENTITY)p 2831 2121 V 32
w(MAP)p Fl(,)f Fd(DYNAMIC)p Fl(,)g Fd(NCOPIES)423 2335
y Fe(Description.)50 b Fl(Returns)32 b(information)f(regarding)i(the)g
(corresp)s(ondence)g(of)g(a)h(v)-5 b(ariable)32 b(and)423
2448 y(the)e Fc(align-tar)-5 b(get)32 b Fl(\(arra)m(y)f(or)f
(template\))i(to)f(whic)m(h)e(it)h(is)f(ultimately)g(aligned.)423
2662 y Fe(Class.)40 b Fl(Mapping)29 b(inquiry)f(subroutine.)423
2876 y Fe(Argumen)m(ts.)423 3064 y Fd(ALIGNEE)744 b Fl(ma)m(y)30
b(b)s(e)g(of)g(an)m(y)g(t)m(yp)s(e.)41 b(It)30 b(ma)m(y)h(b)s(e)e
(scalar)h(or)g(arra)m(y)g(v)-5 b(alued.)40 b(It)1503
3177 y(m)m(ust)22 b(not)h(b)s(e)f(an)g(assumed-size)g(arra)m(y)-8
b(.)39 b(If)22 b(it)g(is)g(a)h(mem)m(b)s(er)e(of)i(an)1503
3290 y(aggregate)41 b(v)-5 b(ariable)36 b(group,)k(then)d(it)g(m)m(ust)
h(b)s(e)f(an)h(aggregate)1503 3403 y(co)m(v)m(er)k(of)e(the)h(group.)70
b(\(See)41 b(Section)f Fe(??)h Fl(for)f(the)g(de\014nitions)1503
3516 y(of)29 b(\\aggregate)k(v)-5 b(ariable)28 b(group")h(and)g
(\\aggregate)k(co)m(v)m(er."\))43 b(It)1503 3629 y(m)m(ust)28
b(not)h(b)s(e)f(a)h(p)s(oin)m(ter)e(that)i(is)f(disasso)s(ciated)g(or)g
(an)h(allo)s(cat-)1503 3742 y(able)39 b(arra)m(y)i(that)f(is)f(not)h
(allo)s(cated.)69 b(It)40 b(is)f(an)h Fd(INTENT)46 b(\(IN\))1503
3855 y Fl(argumen)m(t.)1503 4002 y(If)28 b Fd(ALIGNEE)e
Fl(is)i(a)h(p)s(oin)m(ter,)f(information)f(ab)s(out)h(the)h(alignmen)m
(t)1503 4114 y(of)46 b(its)g(target)i(is)d(returned.)88
b(The)46 b(target)i(m)m(ust)e(not)g(b)s(e)g(an)1503 4227
y(assumed-size)19 b(dumm)m(y)h(argumen)m(t)g(or)h(a)f(section)h(of)f
(an)g(assumed-)1503 4340 y(size)38 b(dumm)m(y)f(argumen)m(t.)64
b(If)37 b(the)h(target)i(is)d(\(a)i(section)f(of)7 b(\))39
b(a)1503 4453 y(mem)m(b)s(er)c(of)i(an)f(aggregate)k(v)-5
b(ariable)35 b(group,)i(then)f(the)h(mem-)1503 4566 y(b)s(er)29
b(m)m(ust)h(b)s(e)g(an)g(aggregate)k(co)m(v)m(er)e(of)e(the)h(group.)
423 4730 y Fd(LB)e Fl(\(optional\))561 b(m)m(ust)31 b(b)s(e)g(of)h(t)m
(yp)s(e)g(default)e(in)m(teger)i(and)f(of)h(rank)f(one.)45
b(Its)31 b(size)1503 4843 y(m)m(ust)36 b(b)s(e)h(at)g(least)g(equal)g
(to)h(the)f(rank)f(of)h Fd(ALIGNEE)p Fl(.)e(It)i(is)f(an)1503
4956 y Fd(INTENT)46 b(\(OUT\))21 b Fl(argumen)m(t.)39
b(The)23 b(\014rst)f(elemen)m(t)h(of)h(the)f(i)3498 4923
y Fb(th)3595 4956 y Fl(axis)1503 5068 y(of)f Fd(ALIGNEE)d
Fl(is)i(ultimately)f(aligned)h(to)h(the)g Fd(LB)p Fl(\(i\))3211
5035 y Fb(th)3303 5068 y Fc(align-tar)-5 b(get)1503 5181
y Fl(elemen)m(t)27 b(along)g(the)g(axis)f(of)h(the)g
Fc(align-tar)-5 b(get)37 b Fl(asso)s(ciated)27 b(with)1503
5294 y(the)43 b(i)1698 5261 y Fb(th)1796 5294 y Fl(axis)f(of)i
Fd(ALIGNEE)p Fl(.)d(If)i(the)g(i)2811 5261 y Fb(th)2909
5294 y Fl(axis)g(of)g Fd(ALIGNEE)e Fl(is)i(a)1503 5407
y(collapsed)29 b(axis,)h Fd(LB)p Fl(\(i\))g(is)f(implemen)m(tation)g
(dep)s(enden)m(t.)p eop
%%Page: 2 5
2 4 bop 150 -200 a Fl(2)3039 b Fg(CONTENTS)423 99 y Fd(UB)29
b Fl(\(optional\))561 b(m)m(ust)31 b(b)s(e)g(of)h(t)m(yp)s(e)g(default)
e(in)m(teger)i(and)f(of)h(rank)f(one.)45 b(Its)31 b(size)1503
211 y(m)m(ust)36 b(b)s(e)h(at)g(least)g(equal)g(to)h(the)f(rank)f(of)h
Fd(ALIGNEE)p Fl(.)e(It)i(is)f(an)1503 324 y Fd(INTENT)46
b(\(OUT\))24 b Fl(argumen)m(t.)39 b(The)25 b(last)h(elemen)m(t)f(of)h
(the)g(i)3498 291 y Fb(th)3595 324 y Fl(axis)1503 437
y(of)c Fd(ALIGNEE)d Fl(is)i(ultimately)f(aligned)h(to)h(the)g
Fd(UB)p Fl(\(i\))3211 404 y Fb(th)3303 437 y Fc(align-tar)-5
b(get)1503 550 y Fl(elemen)m(t)27 b(along)g(the)g(axis)f(of)h(the)g
Fc(align-tar)-5 b(get)37 b Fl(asso)s(ciated)27 b(with)1503
663 y(the)43 b(i)1698 630 y Fb(th)1796 663 y Fl(axis)f(of)i
Fd(ALIGNEE)p Fl(.)d(If)i(the)g(i)2811 630 y Fb(th)2909
663 y Fl(axis)g(of)g Fd(ALIGNEE)e Fl(is)i(a)1503 776
y(collapsed)29 b(axis,)h Fd(UB)p Fl(\(i\))g(is)f(implemen)m(tation)g
(dep)s(enden)m(t.)423 936 y Fd(STRIDE)f Fl(\(optional\))370
b(m)m(ust)31 b(b)s(e)g(of)h(t)m(yp)s(e)g(default)e(in)m(teger)i(and)f
(of)h(rank)f(one.)45 b(Its)31 b(size)1503 1049 y(m)m(ust)36
b(b)s(e)h(at)g(least)g(equal)g(to)h(the)f(rank)f(of)h
Fd(ALIGNEE)p Fl(.)e(It)i(is)f(an)1503 1162 y Fd(INTENT)46
b(\(OUT\))38 b Fl(argumen)m(t.)69 b(The)39 b(i)2807 1129
y Fb(th)2905 1162 y Fl(elemen)m(t)h(of)g Fd(STRIDE)e
Fl(is)1503 1275 y(set)27 b(to)g(the)g(stride)e(used)h(in)f(aligning)g
(the)h(elemen)m(ts)h(of)g Fd(ALIGNEE)1503 1388 y Fl(along)h(its)g(i)
1894 1355 y Fb(th)1992 1388 y Fl(axis.)40 b(If)28 b(the)h(i)2482
1355 y Fb(th)2580 1388 y Fl(axis)f(of)h Fd(ALIGNEE)d
Fl(is)i(a)h(collapsed)1503 1500 y(axis,)h Fd(STRIDE)p
Fl(\(i\))e(is)i(zero.)423 1660 y Fd(AXIS)p 621 1660 29
4 v 33 w(MAP)f Fl(\(optional\))288 b(m)m(ust)31 b(b)s(e)g(of)h(t)m(yp)s
(e)g(default)e(in)m(teger)i(and)f(of)h(rank)f(one.)45
b(Its)31 b(size)1503 1773 y(m)m(ust)36 b(b)s(e)h(at)g(least)g(equal)g
(to)h(the)f(rank)f(of)h Fd(ALIGNEE)p Fl(.)e(It)i(is)f(an)1503
1886 y Fd(INTENT)46 b(\(OUT\))27 b Fl(argumen)m(t.)41
b(The)28 b(i)2757 1853 y Fb(th)2855 1886 y Fl(elemen)m(t)i(of)f
Fd(AXIS)p 3490 1886 V 33 w(MAP)f Fl(is)1503 1999 y(set)h(to)h(the)f
Fc(align-tar)-5 b(get)39 b Fl(axis)29 b(asso)s(ciated)g(with)f(the)h(i)
3395 1966 y Fb(th)3493 1999 y Fl(axis)g(of)1503 2112
y Fd(ALIGNEE)p Fl(.)39 b(If)i(the)g(i)2198 2079 y Fb(th)2296
2112 y Fl(axis)g(of)g Fd(ALIGNEE)e Fl(is)h(a)i(collapsed)e(axis,)1503
2225 y Fd(AXIS)p 1701 2225 V 33 w(MAP\()p Fl(i)p Fd(\))28
b Fl(is)i(0.)423 2385 y Fd(IDENTITY)p 813 2385 V 32 w(MAP)f
Fl(\(optional\))97 b(m)m(ust)23 b(b)s(e)g(scalar)g(and)g(of)h(t)m(yp)s
(e)g(default)e(logical.)38 b(It)24 b(is)e(an)i Fd(INTENT)1503
2498 y(\(OUT\))35 b Fl(argumen)m(t.)60 b(It)36 b(is)g(set)h(to)g(true)g
(if)e(the)i(ultimate)f Fc(align-)1503 2611 y(tar)-5 b(get)45
b Fl(asso)s(ciated)36 b(with)e Fd(ALIGNEE)f Fl(has)i(a)h(shap)s(e)e
(iden)m(tical)g(to)1503 2724 y Fd(ALIGNEE)p Fl(,)43 b(the)h(axes)i(are)
f(mapp)s(ed)e(using)g(the)i(iden)m(tit)m(y)f(p)s(er-)1503
2836 y(m)m(utation,)35 b(and)e(the)i(strides)d(are)j(all)e(p)s(ositiv)m
(e)g(\(and)g(therefore)1503 2949 y(equal)28 b(to)i(1,)g(b)s(ecause)f
(of)h(the)f(shap)s(e)f(constrain)m(t\);)j(otherwise)d(it)1503
3062 y(is)23 b(set)i(to)g(false.)39 b(If)23 b(a)i(v)-5
b(ariable)23 b(has)h(not)h(app)s(eared)f(as)g(an)h Fc(aligne)-5
b(e)1503 3175 y Fl(in)28 b(an)i Fd(ALIGN)f Fl(or)h Fd(REALIGN)e
Fl(directiv)m(e,)i(and)f(do)s(es)h(not)g(ha)m(v)m(e)i(the)1503
3288 y Fd(INHERIT)j Fl(attribute,)j(then)e Fd(IDENTITY)p
2894 3288 V 33 w(MAP)f Fl(m)m(ust)i(b)s(e)f(true;)k(it)1503
3401 y(can)30 b(b)s(e)g(true)g(in)f(other)i(circumstances)f(as)h(w)m
(ell.)423 3561 y Fd(DYNAMIC)d Fl(\(optional\))322 b(m)m(ust)23
b(b)s(e)g(scalar)g(and)g(of)h(t)m(yp)s(e)g(default)e(logical.)38
b(It)24 b(is)e(an)i Fd(INTENT)1503 3674 y(\(OUT\))42
b Fl(argumen)m(t.)83 b(It)44 b(is)f(set)i(to)g(true)f(if)f
Fd(ALIGNEE)f Fl(has)i(the)1503 3787 y Fd(DYNAMIC)24 b
Fl(attribute;)k(otherwise)e(it)f(is)h(set)h(to)g(false.)39
b(If)26 b Fd(ALIGNEE)1503 3900 y Fl(has)20 b(the)g(p)s(oin)m(ter)f
(attribute,)k(then)d(the)g(result)f(applies)g(to)i Fd(ALIGN)p
Fl(-)1503 4013 y Fd(EE)29 b Fl(itself)h(rather)g(than)g(its)g(target.)
423 4173 y Fd(NCOPIES)e Fl(\(optional\))322 b(m)m(ust)21
b(b)s(e)g(scalar)h(and)f(of)h(t)m(yp)s(e)g(default)f(in)m(teger.)38
b(It)22 b(is)f(an)h Fd(INTENT)1503 4285 y(\(OUT\))42
b Fl(argumen)m(t.)81 b(It)44 b(is)f(set)h(to)h(the)f(n)m(um)m(b)s(er)e
(of)i(copies)g(of)1503 4398 y Fd(ALIGNEE)30 b Fl(that)j(are)g
(ultimately)e(aligned)g(to)i Fc(align-tar)-5 b(get)9
b Fl(.)48 b(F)-8 b(or)1503 4511 y(a)30 b(non-replicated)g(v)-5
b(ariable,)29 b(it)h(is)f(set)i(to)g(one.)423 4715 y
Fe(Examples.)50 b Fl(If)34 b Fd(ALIGNEE)e Fl(is)h(scalar,)j(then)e(no)g
(elemen)m(ts)g(of)g Fd(LB)p Fl(,)g Fd(UB)p Fl(,)g Fd(STRIDE)p
Fl(,)e(or)j Fd(AXIS)p 3580 4715 V 33 w(MAP)423 4828 y
Fl(are)30 b(set.)423 4977 y(Giv)m(en)g(the)h(declarations)527
5181 y Fd(REAL)47 b(PI)g(=)h(3.1415927)527 5294 y(POINTER)e
(P_TO_A\(:\))527 5407 y(DIMENSION)g(A\(10,10\),B\(20,30\),C\(20,)o(40,)
o(10\),)o(D\(40)o(\))p eop
%%Page: 3 6
3 5 bop 150 -200 a Fg(0.1.)72 b(MAPPING)31 b(INQUIR)-8
b(Y)31 b(PR)m(OCEDURES)1792 b Fl(3)241 99 y Fd(!HPF$)46
b(TEMPLATE)g(T\(40,20\))241 211 y(!HPF$)g(DYNAMIC)g(A)241
324 y(!HPF$)g(ALIGN)h(A\(I,:\))f(WITH)g(T\(1+3*I,2:20:2\))241
437 y(!HPF$)g(ALIGN)h(C\(I,*,J\))e(WITH)i(T\(J,21-I\))241
550 y(!HPF$)f(ALIGN)h(D\(I\))f(WITH)h(T\(I,4\))241 663
y(!HPF$)f(PROCESSORS)f(PROCS\(4,2\),)g(SCALARPROC)241
776 y(!HPF$)h(DISTRIBUTE)f(T\(BLOCK,BLOCK\))f(ONTO)j(PROCS)241
889 y(!HPF$)f(DISTRIBUTE)f(B\(CYCLIC,BLOCK\))f(ONTO)j(PROCS)241
1002 y(!HPF$)f(DISTRIBUTE)f(ONTO)i(SCALARPROC)e(::)i(PI)527
1115 y(P_TO_A)f(=>)i(A\(3:9:2,)d(6\))150 1330 y Fl(assuming)19
b(that)i(the)f(actual)h(mappings)d(are)j(as)f(the)h(directiv)m(es)f(sp)
s(ecify)-8 b(,)21 b(the)g(results)e(of)h Fd(HPF)p 3294
1330 29 4 v 34 w(ALIGNMENT)150 1443 y Fl(are:)p 599 1532
2702 4 v 597 1631 4 100 v 1346 1631 V 1498 1601 a Fa(A)p
1709 1631 V 303 w(B)p 2072 1631 V 404 w(C)p 2637 1631
V 351 w(D)p 2896 1631 V 148 w(P)p 3010 1601 25 4 v 29
w(TO)p 3164 1601 V 30 w(A)p 3299 1631 4 100 v 599 1635
2702 4 v 599 1651 V 597 1751 4 100 v 649 1721 a(LB)p
1346 1751 V 679 w([4,)28 b(2])p 1709 1751 V 182 w([1,)f(1])p
2072 1751 V 155 w([20,)g(N/A,)g(1])p 2637 1751 V 149
w([1])p 2896 1751 V 223 w([10])p 3299 1751 V 599 1754
2702 4 v 597 1854 4 100 v 649 1824 a(UB)p 1346 1854 V
628 w([31,)g(20])p 1709 1854 V 98 w([20,)g(30])p 2072
1854 V 99 w([)h(1,)f(N/A,)h(10])p 2637 1854 V 114 w([40])p
2896 1854 V 201 w([28])p 3299 1854 V 599 1857 2702 4
v 597 1957 4 100 v 649 1927 a(STRIDE)p 1346 1957 V 473
w([3,)g(2])p 1709 1957 V 182 w([1,)f(1])p 2072 1957 V
224 w([-1,)g(0,)g(1])p 2637 1957 V 218 w([1])p 2896 1957
V 230 w([)g(6])p 3299 1957 V 599 1960 2702 4 v 597 2060
4 100 v 649 2030 a(AXIS)p 854 2030 25 4 v 31 w(MAP)p
1346 2060 4 100 v 364 w([1,)h(2])p 1709 2060 V 182 w([1,)f(2])p
2072 2060 V 238 w([2,)g(0,)g(1])p 2637 2060 V 232 w([1])p
2896 2060 V 230 w([)g(1])p 3299 2060 V 599 2063 2702
4 v 597 2163 4 100 v 649 2133 a(IDENTITY)p 1078 2133
25 4 v 30 w(MAP)p 1346 2163 4 100 v 152 w(false)p 1709
2163 V 208 w(true)p 2072 2163 V 310 w(false)p 2637 2163
V 252 w(false)p 2896 2163 V 171 w(false)p 3299 2163 V
599 2166 2702 4 v 597 2266 4 100 v 649 2236 a(D)n(YNAMIC)p
1346 2266 V 393 w(true)p 1709 2266 V 209 w(false)p 2072
2266 V 304 w(false)p 2637 2266 V 252 w(false)p 2896 2266
V 171 w(false)p 3299 2266 V 599 2269 2702 4 v 597 2368
4 100 v 649 2339 a(NCOPIES)p 1346 2368 V 483 w(1)p 1709
2368 V 320 w(1)p 2072 2368 V 422 w(1)p 2637 2368 V 371
w(1)p 2896 2368 V 288 w(1)p 3299 2368 V 599 2372 2702
4 v 150 2525 a Fl(where)f(\\N/A")i(denotes)e(a)h(implemen)m(tation-dep)
s(enden)m(t)d(result.)39 b(T)-8 b(o)26 b(illustrate)f(the)h(use)g(of)h
Fd(NCOPIES)p Fl(,)150 2638 y(consider:)527 2828 y Fd(LOGICAL)46
b(BOZO\(20,20\),RONALD_MCDONA)o(LD\()o(20\))241 2941
y(!HPF$)g(TEMPLATE)g(EMMETT_KELLY\(100,100\))241 3054
y(!HPF$)g(ALIGN)h(RONALD_MCDONALD\(I\))42 b(WITH)47 b(BOZO\(I,*\))241
3167 y(!HPF$)f(ALIGN)h(BOZO\(J,K\))e(WITH)i(EMMETT_KELLY\(J,5*K\))150
3357 y(CALL)g(HPF)p 539 3357 29 4 v 33 w(ALIGNMENT\(RONALD)p
1340 3357 V 30 w(MCDONALD,)e(NCOPIES)h(=)i(NC\))29 b
Fl(sets)i Fd(NC)f Fl(to)h(20.)41 b(No)m(w)31 b(consider:)527
3547 y Fd(LOGICAL)46 b(BOZO\(20,20\),RONALD_MCDONA)o(LD\()o(20\))241
3660 y(!HPF$)g(TEMPLATE)g(WILLIE_WHISTLE\(100\))241 3773
y(!HPF$)g(ALIGN)h(RONALD_MCDONALD\(I\))42 b(WITH)47 b(BOZO\(I,*\))241
3885 y(!HPF$)f(ALIGN)h(BOZO\(J,*\))e(WITH)i(WILLIE_WHISTLE\(5*J\))150
4075 y(CALL)g(HPF)p 539 4075 V 33 w(ALIGNMENT\(RONALD)p
1340 4075 V 30 w(MCDONALD,)e(NCOPIES)h(=)i(NC\))29 b
Fl(sets)i Fd(NC)f Fl(to)h(one.)150 4322 y Ff(0.1.3)97
b(HPF)p 639 4322 30 4 v 36 w(TEMPLA)-8 b(TE\(ALIGNEE,)43
b(TEMPLA)-8 b(TE)p 2188 4322 V 34 w(RANK,)44 b(LB,)f(UB,)h(AXIS)p
3154 4322 V 36 w(TYPE,)f(AXIS)p 3720 4322 V 448 4438
a(INF)m(O,)33 b(NUMBER)p 1138 4438 V 35 w(ALIGNED,)g(D)m(YNAMIC\))423
4610 y Fe(Optional)h(Argumen)m(ts.)40 b Fd(LB)p Fl(,)30
b Fd(UB)p Fl(,)g Fd(AXIS)p 1928 4610 29 4 v 33 w(TYPE)p
Fl(,)g Fd(AXIS)p 2400 4610 V 33 w(INFO)p Fl(,)g Fd(NUMBER)p
2968 4610 V 32 w(ALIGNED)p Fl(,)423 4723 y Fd(TEMPLATE)p
813 4723 V 32 w(RANK)p Fl(,)f Fd(DYNAMIC)423 4938 y Fe(Description.)51
b Fl(The)32 b Fd(HPF)p 1367 4938 V 34 w(TEMPLATE)f Fl(subroutine)h
(returns)g(information)g(regarding)g(the)i(ul-)423 5051
y(timate)43 b Fc(align-tar)-5 b(get)52 b Fl(asso)s(ciated)44
b(with)d(a)i(v)-5 b(ariable;)48 b Fd(HPF)p 2509 5051
V 34 w(TEMPLATE)40 b Fl(returns)i(information)423 5164
y(concerning)33 b(the)g(v)-5 b(ariable)33 b(from)g(the)g(template's)h
(p)s(oin)m(t)f(of)h(view)e(\(assuming)h(the)h(alignmen)m(t)423
5277 y(is)29 b(to)i(a)f(template)h(rather)f(than)g(to)h(an)f(arra)m
(y\),)h(while)d Fd(HPF)p 2486 5277 V 34 w(ALIGNMENT)g
Fl(returns)h(information)423 5390 y(from)h(the)g(v)-5
b(ariable's)29 b(p)s(oin)m(t)h(of)g(view.)p eop
%%Page: 4 7
4 6 bop 150 -200 a Fl(4)3039 b Fg(CONTENTS)423 99 y Fe(Class.)40
b Fl(Mapping)29 b(inquiry)f(subroutine.)423 340 y Fe(Argumen)m(ts.)423
557 y Fd(ALIGNEE)744 b Fl(ma)m(y)30 b(b)s(e)g(of)g(an)m(y)g(t)m(yp)s
(e.)41 b(It)30 b(ma)m(y)h(b)s(e)e(scalar)h(or)g(arra)m(y)g(v)-5
b(alued.)40 b(It)1503 670 y(m)m(ust)22 b(not)h(b)s(e)f(an)g
(assumed-size)g(arra)m(y)-8 b(.)39 b(If)22 b(it)g(is)g(a)h(mem)m(b)s
(er)e(of)i(an)1503 783 y(aggregate)41 b(v)-5 b(ariable)36
b(group,)k(then)d(it)g(m)m(ust)h(b)s(e)f(an)h(aggregate)1503
895 y(co)m(v)m(er)k(of)e(the)h(group.)70 b(\(See)41 b(Section)f
Fe(??)h Fl(for)f(the)g(de\014nitions)1503 1008 y(of)29
b(\\aggregate)k(v)-5 b(ariable)28 b(group")h(and)g(\\aggregate)k(co)m
(v)m(er."\))43 b(It)1503 1121 y(m)m(ust)28 b(not)h(b)s(e)f(a)h(p)s(oin)
m(ter)e(that)i(is)f(disasso)s(ciated)g(or)g(an)h(allo)s(cat-)1503
1234 y(able)39 b(arra)m(y)i(that)f(is)f(not)h(allo)s(cated.)69
b(It)40 b(is)f(an)h Fd(INTENT)46 b(\(IN\))1503 1347 y
Fl(argumen)m(t.)1503 1508 y(If)28 b Fd(ALIGNEE)e Fl(is)i(a)h(p)s(oin)m
(ter,)f(information)f(ab)s(out)h(the)h(alignmen)m(t)1503
1621 y(of)46 b(its)g(target)i(is)d(returned.)88 b(The)46
b(target)i(m)m(ust)e(not)g(b)s(e)g(an)1503 1734 y(assumed-size)19
b(dumm)m(y)h(argumen)m(t)g(or)h(a)f(section)h(of)f(an)g(assumed-)1503
1846 y(size)38 b(dumm)m(y)f(argumen)m(t.)64 b(If)37 b(the)h(target)i
(is)d(\(a)i(section)f(of)7 b(\))39 b(a)1503 1959 y(mem)m(b)s(er)c(of)i
(an)f(aggregate)k(v)-5 b(ariable)35 b(group,)i(then)f(the)h(mem-)1503
2072 y(b)s(er)29 b(m)m(ust)h(b)s(e)g(an)g(aggregate)k(co)m(v)m(er)e(of)
e(the)h(group.)423 2257 y Fd(TEMPLATE)p 813 2257 29 4
v 32 w(RANK)e Fl(\(optional\))49 b(m)m(ust)21 b(b)s(e)g(scalar)h(and)f
(of)h(t)m(yp)s(e)g(default)f(in)m(teger.)38 b(It)22 b(is)f(an)h
Fd(INTENT)1503 2370 y(\(OUT\))40 b Fl(argumen)m(t.)74
b(It)42 b(is)e(set)i(to)h(the)e(rank)g(of)h(the)g(ultimate)1503
2483 y Fc(align-tar)-5 b(get)9 b Fl(.)57 b(This)34 b(can)i(b)s(e)f
(di\013eren)m(t)g(from)g(the)h(rank)f(of)h(the)1503 2596
y Fd(ALIGNEE)p Fl(,)28 b(due)i(to)h(collapsing)e(and)h(replicating.)423
2780 y Fd(LB)f Fl(\(optional\))561 b(m)m(ust)31 b(b)s(e)g(of)h(t)m(yp)s
(e)g(default)e(in)m(teger)i(and)f(of)h(rank)f(one.)45
b(Its)31 b(size)1503 2893 y(m)m(ust)i(b)s(e)f(at)i(least)f(equal)g(to)h
(the)f(rank)g(of)g(the)g Fc(align-tar)-5 b(get)43 b Fl(to)1503
3006 y(whic)m(h)h Fd(ALIGNEE)f Fl(is)h(ultimately)g(aligned;)52
b(this)44 b(is)g(the)h(v)-5 b(alue)1503 3119 y(returned)26
b(in)h Fd(TEMPLATE)p 2363 3119 V 32 w(RANK)p Fl(.)g(It)h(is)f(an)h
Fd(INTENT)46 b(\(OUT\))27 b Fl(argu-)1503 3232 y(men)m(t.)44
b(The)31 b(i)1985 3199 y Fb(th)2083 3232 y Fl(elemen)m(t)h(of)g
Fd(LB)f Fl(con)m(tains)g(the)h(declared)f Fc(align-)1503
3345 y(tar)-5 b(get)40 b Fl(lo)m(w)m(er)30 b(b)s(ound)f(for)h(the)g(i)
2605 3312 y Fb(th)2703 3345 y Fl(template)h(axis.)423
3529 y Fd(UB)e Fl(\(optional\))561 b(m)m(ust)31 b(b)s(e)g(of)h(t)m(yp)s
(e)g(default)e(in)m(teger)i(and)f(of)h(rank)f(one.)45
b(Its)31 b(size)1503 3642 y(m)m(ust)i(b)s(e)f(at)i(least)f(equal)g(to)h
(the)f(rank)g(of)g(the)g Fc(align-tar)-5 b(get)43 b Fl(to)1503
3755 y(whic)m(h)h Fd(ALIGNEE)f Fl(is)h(ultimately)g(aligned;)52
b(this)44 b(is)g(the)h(v)-5 b(alue)1503 3868 y(returned)26
b(in)h Fd(TEMPLATE)p 2363 3868 V 32 w(RANK)p Fl(.)g(It)h(is)f(an)h
Fd(INTENT)46 b(\(OUT\))27 b Fl(argu-)1503 3981 y(men)m(t.)44
b(The)31 b(i)1985 3948 y Fb(th)2083 3981 y Fl(elemen)m(t)h(of)g
Fd(UB)f Fl(con)m(tains)g(the)h(declared)f Fc(align-)1503
4094 y(tar)-5 b(get)40 b Fl(upp)s(er)28 b(b)s(ound)h(for)h(the)g(i)2628
4061 y Fb(th)2726 4094 y Fl(template)h(axis.)423 4278
y Fd(AXIS)p 621 4278 V 33 w(TYPE)e Fl(\(optional\))240
b(m)m(ust)38 b(b)s(e)f(a)i(rank)f(one)g(arra)m(y)h(of)f(t)m(yp)s(e)h
(default)e(c)m(haracter.)66 b(It)1503 4391 y(ma)m(y)48
b(b)s(e)f(of)h(an)m(y)g(length,)k(although)47 b(it)h(m)m(ust)f(b)s(e)h
(of)g(length)1503 4504 y(at)40 b(least)g(10)h(in)d(order)h(to)i(con)m
(tain)f(the)g(complete)g(v)-5 b(alue.)68 b(Its)1503 4617
y(elemen)m(ts)48 b(are)g(set)g(to)g(the)g(v)-5 b(alues)47
b(b)s(elo)m(w)f(as)i(if)f(b)m(y)g(a)h(c)m(har-)1503 4730
y(acter)c(in)m(trinsic)d(assignmen)m(t)i(statemen)m(t.)82
b(Its)43 b(size)g(m)m(ust)h(b)s(e)1503 4843 y(at)f(least)f(equal)g(to)h
(the)g(rank)e(of)i(the)f Fc(align-tar)-5 b(get)52 b Fl(to)43
b(whic)m(h)1503 4956 y Fd(ALIGNEE)30 b Fl(is)i(ultimately)e(aligned;)j
(this)e(is)h(the)g(v)-5 b(alue)32 b(returned)1503 5068
y(in)23 b Fd(TEMPLATE)p 1993 5068 V 32 w(RANK)p Fl(.)g(It)h(is)f(an)i
Fd(INTENT)46 b(\(OUT\))22 b Fl(argumen)m(t.)39 b(The)1503
5181 y(i)1529 5148 y Fb(th)1626 5181 y Fl(elemen)m(t)32
b(of)f Fd(AXIS)p 2265 5181 V 33 w(TYPE)e Fl(con)m(tains)i(information)e
(ab)s(out)i(the)1503 5294 y(i)1529 5261 y Fb(th)1626
5294 y Fl(axis)k(of)f(the)h Fc(align-tar)-5 b(get)9 b
Fl(.)55 b(The)34 b(follo)m(wing)f(v)-5 b(alues)34 b(are)h(de-)1503
5407 y(\014ned)23 b(b)m(y)i(HPF)g(\(implemen)m(tations)f(ma)m(y)h
(de\014ne)f(other)h(v)-5 b(alues\):)p eop
%%Page: 5 8
5 7 bop 150 -200 a Fg(0.1.)72 b(MAPPING)31 b(INQUIR)-8
b(Y)31 b(PR)m(OCEDURES)1792 b Fl(5)1503 99 y Fd('NORMAL')43
b Fl(The)37 b Fc(align-tar)-5 b(get)48 b Fl(axis)37 b(has)g(an)h(axis)f
(of)h Fd(ALIGNEE)1673 211 y Fl(aligned)j(to)j(it.)78
b(F)-8 b(or)43 b(elemen)m(ts)h(of)f Fd(AXIS)p 3160 211
29 4 v 33 w(TYPE)f Fl(assigned)1673 324 y(this)36 b(v)-5
b(alue,)39 b(the)e(corresp)s(onding)f(elemen)m(t)h(of)h
Fd(AXIS)p 3532 324 V 33 w(INFO)1673 437 y Fl(is)c(set)i(to)g(the)g(n)m
(um)m(b)s(er)e(of)h(the)h(axis)e(of)i Fd(ALIGNEE)d Fl(aligned)1673
550 y(to)e(this)e Fc(align-tar)-5 b(get)40 b Fl(axis.)1503
678 y Fd('REPLICATED')i(ALIGNEE)21 b Fl(is)h(replicated)g(along)h(this)
f Fc(align-tar-)1673 791 y(get)51 b Fl(axis.)78 b(F)-8
b(or)44 b(elemen)m(ts)f(of)g Fd(AXIS)p 2970 791 V 33
w(TYPE)f Fl(assigned)g(this)1673 904 y(v)-5 b(alue,)28
b(the)h(corresp)s(onding)e(elemen)m(t)i(of)f Fd(AXIS)p
3302 904 V 33 w(INFO)g Fl(is)f(set)1673 1017 y(to)j(the)h(n)m(um)m(b)s
(er)d(of)i(copies)g(of)g Fd(ALIGNEE)e Fl(along)i(this)f
Fc(align-)1673 1130 y(tar)-5 b(get)40 b Fl(axis.)1503
1258 y Fd('SINGLE')j(ALIGNEE)28 b Fl(is)i(aligned)f(with)g(one)i(co)s
(ordinate)f(of)h(the)1673 1371 y Fc(align-tar)-5 b(get)32
b Fl(axis.)37 b(F)-8 b(or)23 b(elemen)m(ts)g(of)f Fd(AXIS)p
3180 1371 V 34 w(TYPE)f Fl(assigned)1673 1484 y(this)h(v)-5
b(alue,)24 b(the)g(corresp)s(onding)d(elemen)m(t)j(of)f
Fd(AXIS)p 3447 1484 V 34 w(INFO)f Fl(is)1673 1597 y(set)35
b(to)g(the)g Fc(align-tar)-5 b(get)44 b Fl(co)s(ordinate)34
b(to)i(whic)m(h)d Fd(ALIGNEE)1673 1710 y Fl(is)c(aligned.)423
1876 y Fd(AXIS)p 621 1876 V 33 w(INFO)g Fl(\(optional\))240
b(m)m(ust)31 b(b)s(e)g(of)h(t)m(yp)s(e)g(default)e(in)m(teger)i(and)f
(of)h(rank)f(one.)45 b(Its)31 b(size)1503 1989 y(m)m(ust)i(b)s(e)f(at)i
(least)f(equal)g(to)h(the)f(rank)g(of)g(the)g Fc(align-tar)-5
b(get)43 b Fl(to)1503 2102 y(whic)m(h)h Fd(ALIGNEE)f
Fl(is)h(ultimately)g(aligned;)52 b(this)44 b(is)g(the)h(v)-5
b(alue)1503 2215 y(returned)26 b(in)h Fd(TEMPLATE)p 2363
2215 V 32 w(RANK)p Fl(.)g(It)h(is)f(an)h Fd(INTENT)46
b(\(OUT\))27 b Fl(argu-)1503 2328 y(men)m(t.)41 b(See)30
b(the)h(description)d(of)j Fd(AXIS)p 2853 2328 V 33 w(TYPE)e
Fl(ab)s(o)m(v)m(e.)423 2488 y Fd(NUMBER)p 717 2488 V
32 w(ALIGNED)g Fl(\(optional\))45 b(m)m(ust)h(b)s(e)f(scalar)g(and)g
(of)h(t)m(yp)s(e)g(default)f(in)m(teger.)87 b(It)45 b(is)g(an)1503
2601 y Fd(INTENT)h(\(OUT\))37 b Fl(argumen)m(t.)67 b(It)39
b(is)f(set)h(to)h(the)f(total)g(n)m(um)m(b)s(er)1503
2714 y(of)33 b(v)-5 b(ariables)33 b(aligned)f(to)i(the)g(ultimate)f
Fc(align-tar)-5 b(get)9 b Fl(.)51 b(This)32 b(is)1503
2827 y(the)26 b(n)m(um)m(b)s(er)e(of)i(v)-5 b(ariables)24
b(that)i(are)h(mo)m(v)m(ed)f(if)f(the)h Fc(align-tar)-5
b(get)1503 2940 y Fl(is)29 b(redistributed.)423 3099
y Fd(DYNAMIC)f Fl(\(optional\))322 b(m)m(ust)23 b(b)s(e)g(scalar)g(and)
g(of)h(t)m(yp)s(e)g(default)e(logical.)38 b(It)24 b(is)e(an)i
Fd(INTENT)1503 3212 y(\(OUT\))32 b Fl(argumen)m(t.)52
b(It)34 b(is)f(set)i(to)g(true)e(if)g(the)h Fc(align-tar)-5
b(get)44 b Fl(has)1503 3325 y(the)30 b Fd(DYNAMIC)f Fl(attribute,)h
(and)g(to)h(false)f(otherwise.)423 3529 y Fe(Example.)64
b Fl(Giv)m(en)39 b(the)g(declarations)f(in)f(the)i(example)g(of)g
(Section)f(0.1.2,)43 b(and)38 b(assuming)423 3642 y(that)c(the)g
(actual)g(mappings)d(are)j(as)g(the)g(directiv)m(es)f(sp)s(ecify)-8
b(,)34 b(the)g(results)e(of)i Fd(HPF)p 3341 3642 V 33
w(TEMPLATE)423 3755 y Fl(are:)p 646 3858 2609 4 v 644
3957 4 100 v 1542 3957 V 1798 3927 a Fa(A)p 2112 3957
V 509 w(C)p 2682 3957 V 508 w(D)p 3252 3957 V 646 3961
2609 4 v 646 3977 V 644 4077 4 100 v 696 4047 a(LB)p
1542 4077 V 932 w([1,)27 b(1])p 2112 4077 V 390 w([1,)g(1])p
2682 4077 V 390 w([1,)g(1])p 3252 4077 V 646 4080 2609
4 v 644 4180 4 100 v 696 4150 a(UB)p 1542 4180 V 880
w([40,)g(20])p 2112 4180 V 307 w([40,)f(20])p 2682 4180
V 307 w([40,)g(20])p 3252 4180 V 646 4183 2609 4 v 644
4283 4 100 v 696 4253 a(AXIS)p 901 4253 25 4 v 30 w(TYPE)p
1542 4283 4 100 v 432 w(['NORMAL',)p 2112 4283 V 100
w(['NORMAL',)p 2682 4283 V 100 w(['NORMAL',)p 3252 4283
V 644 4382 V 1542 4382 V 1605 4353 a('NORMAL'])p 2112
4382 V 123 w('NORMAL'])p 2682 4382 V 157 w('SINGLE'])p
3252 4382 V 646 4386 2609 4 v 644 4485 4 100 v 696 4455
a(AXIS)p 901 4455 25 4 v 30 w(INF)n(O)p 1542 4485 4 100
v 604 w([1,)h(2])p 2112 4485 V 390 w([3,)g(1])p 2682
4485 V 390 w([1,)g(4])p 3252 4485 V 646 4489 2609 4 v
644 4588 4 100 v 696 4558 a(NUMBER)p 1078 4558 25 4 v
30 w(ALIGNED)p 1542 4588 4 100 v 314 w(3)p 2112 4588
V 528 w(3)p 2682 4588 V 528 w(3)p 3252 4588 V 646 4592
2609 4 v 644 4691 4 100 v 696 4661 a(TEMPLA)-7 b(TE)p
1175 4661 25 4 v 28 w(RANK)p 1542 4691 4 100 v 360 w(2)p
2112 4691 V 528 w(2)p 2682 4691 V 528 w(2)p 3252 4691
V 646 4695 2609 4 v 644 4794 4 100 v 696 4764 a(D)n(YNAMIC)p
1542 4794 V 640 w(false)p 2112 4794 V 410 w(false)p 2682
4794 V 410 w(false)p 3252 4794 V 646 4798 2609 4 v 150
5006 a Ff(0.1.4)97 b(HPF)p 639 5006 30 4 v 36 w
(DISTRIBUTION\(DISTRIBUTEE,)19 b(AXIS)p 2263 5006 V 35
w(TYPE,)j(AXIS)p 2807 5006 V 36 w(INF)m(O,)g(PROCESSORS)p
3725 5006 V 448 5123 a(RANK,)33 b(PROCESSORS)p 1390 5123
V 36 w(SHAPE,)h(PLB,)e(PUB,)h(PSTRIDE\))423 5294 y Fe(Optional)h
(Argumen)m(ts.)40 b Fd(AXIS)p 1626 5294 29 4 v 33 w(TYPE)p
Fl(,)30 b Fd(AXIS)p 2098 5294 V 33 w(INFO)p Fl(,)g Fd(PROCESSORS)p
2858 5294 V 31 w(RANK)p Fl(,)423 5407 y Fd(PROCESSORS)p
909 5407 V 31 w(SHAPE)p Fl(,)g Fd(PLB)p Fl(,)f Fd(PUB)p
Fl(,)h Fd(PSTRIDE)p Fl(,)p eop
%%Page: 6 9
6 8 bop 150 -200 a Fl(6)3039 b Fg(CONTENTS)423 99 y Fe(Description.)40
b Fl(The)26 b Fd(HPF)p 1350 99 29 4 v 34 w(DISTRIBUTION)d
Fl(subroutine)i(returns)g(information)g(regarding)h(the)423
211 y(distribution)g(of)31 b(the)g(ultimate)e Fc(align-tar)-5
b(get)40 b Fl(asso)s(ciated)31 b(with)e(a)i(v)-5 b(ariable.)423
435 y Fe(Class.)40 b Fl(Mapping)29 b(inquiry)f(subroutine.)423
659 y Fe(Argumen)m(ts.)423 858 y Fd(DISTRIBUTEE)552 b
Fl(ma)m(y)30 b(b)s(e)g(of)g(an)m(y)g(t)m(yp)s(e.)41 b(It)30
b(ma)m(y)h(b)s(e)e(scalar)h(or)g(arra)m(y)g(v)-5 b(alued.)40
b(It)1503 971 y(m)m(ust)22 b(not)h(b)s(e)f(an)g(assumed-size)g(arra)m
(y)-8 b(.)39 b(If)22 b(it)g(is)g(a)h(mem)m(b)s(er)e(of)i(an)1503
1084 y(aggregate)41 b(v)-5 b(ariable)36 b(group,)k(then)d(it)g(m)m(ust)
h(b)s(e)f(an)h(aggregate)1503 1196 y(co)m(v)m(er)k(of)e(the)h(group.)70
b(\(See)41 b(Section)f Fe(??)h Fl(for)f(the)g(de\014nitions)1503
1309 y(of)29 b(\\aggregate)k(v)-5 b(ariable)28 b(group")h(and)g
(\\aggregate)k(co)m(v)m(er."\))43 b(It)1503 1422 y(m)m(ust)28
b(not)h(b)s(e)f(a)h(p)s(oin)m(ter)e(that)i(is)f(disasso)s(ciated)g(or)g
(an)h(allo)s(cat-)1503 1535 y(able)39 b(arra)m(y)i(that)f(is)f(not)h
(allo)s(cated.)69 b(It)40 b(is)f(an)h Fd(INTENT)46 b(\(IN\))1503
1648 y Fl(argumen)m(t.)1503 1800 y(If)35 b Fd(DISTRIBUTEE)e
Fl(is)h(a)i(p)s(oin)m(ter,)h(information)d(ab)s(out)h(the)h(dis-)1503
1913 y(tribution)d(of)j(its)f(target)i(is)e(returned.)55
b(The)35 b(target)i(m)m(ust)f(not)1503 2026 y(b)s(e)d(an)i
(assumed-size)e(dumm)m(y)h(argumen)m(t)g(or)g(a)h(section)g(of)f(an)
1503 2139 y(assumed-size)j(dumm)m(y)g(argumen)m(t.)64
b(If)37 b(the)h(target)h(is)e(\(a)i(sec-)1503 2251 y(tion)c(of)7
b(\))36 b(a)g(mem)m(b)s(er)g(of)g(an)f(aggregate)k(v)-5
b(ariable)34 b(group,)j(then)1503 2364 y(the)30 b(mem)m(b)s(er)g(m)m
(ust)g(b)s(e)g(an)g(aggregate)k(co)m(v)m(er)e(of)e(the)h(group.)423
2536 y Fd(AXIS)p 621 2536 V 33 w(TYPE)e Fl(\(optional\))240
b(m)m(ust)38 b(b)s(e)f(a)i(rank)f(one)g(arra)m(y)h(of)f(t)m(yp)s(e)h
(default)e(c)m(haracter.)66 b(It)1503 2648 y(ma)m(y)48
b(b)s(e)f(of)h(an)m(y)g(length,)k(although)47 b(it)h(m)m(ust)f(b)s(e)h
(of)g(length)1503 2761 y(at)c(least)g(9)g(in)e(order)h(to)h(con)m(tain)
g(the)f(complete)h(v)-5 b(alue.)80 b(Its)1503 2874 y(elemen)m(ts)48
b(are)g(set)g(to)g(the)g(v)-5 b(alues)47 b(b)s(elo)m(w)f(as)i(if)f(b)m
(y)g(a)h(c)m(har-)1503 2987 y(acter)c(in)m(trinsic)d(assignmen)m(t)i
(statemen)m(t.)82 b(Its)43 b(size)g(m)m(ust)h(b)s(e)1503
3100 y(at)f(least)f(equal)g(to)h(the)g(rank)e(of)i(the)f
Fc(align-tar)-5 b(get)52 b Fl(to)43 b(whic)m(h)1503 3213
y Fd(DISTRIBUTEE)34 b Fl(is)i(ultimately)g(aligned;)k(this)c(is)g(the)i
(v)-5 b(alue)37 b(re-)1503 3326 y(turned)29 b(b)m(y)h
Fd(HPF)p 2072 3326 V 34 w(TEMPLATE)e Fl(in)h Fd(TEMPLATE)p
3008 3326 V 32 w(RANK)p Fl(\).)h(It)g(is)g(an)1503 3439
y Fd(INTENT)46 b(\(OUT\))34 b Fl(argumen)m(t.)57 b(Its)35
b(i)2734 3406 y Fb(th)2832 3439 y Fl(elemen)m(t)h(con)m(tains)g(infor-)
1503 3552 y(mation)h(on)h(the)g(distribution)d(of)j(the)g(i)2921
3519 y Fb(th)3019 3552 y Fl(axis)f(of)h(that)h Fc(align-)1503
3665 y(tar)-5 b(get)9 b Fl(.)45 b(The)32 b(follo)m(wing)e(v)-5
b(alues)31 b(are)h(de\014ned)e(b)m(y)i(HPF)g(\(imple-)1503
3778 y(men)m(tations)e(ma)m(y)h(de\014ne)f(other)h(v)-5
b(alues\):)1503 3957 y Fd('BLOCK')43 b Fl(The)29 b(axis)g(is)g
(distributed)d Fd(BLOCK)p Fl(.)j(The)g(corresp)s(ond-)1673
4070 y(ing)g(elemen)m(t)i(of)g Fd(AXIS)p 2462 4070 V
33 w(INFO)e Fl(con)m(tains)i(the)f(blo)s(c)m(k)g(size.)1503
4202 y Fd('GEN)p 1701 4202 V 33 w(BLOCK')44 b Fl(The)22
b(axis)g(is)g(distributed)e Fd(BLOCK\(array\))p Fl(.)34
b(The)1673 4315 y(v)-5 b(alue)37 b(of)h(the)g(corresp)s(onding)d
(elemen)m(t)j(of)g Fd(AXIS)p 3433 4315 V 33 w(INFO)f
Fl(is)1673 4428 y(implemen)m(tation)29 b(dep)s(enden)m(t.)1503
4560 y Fd('COLLAPSED')42 b Fl(The)28 b(axis)h(is)e(collapsed)h
(\(distributed)e(with)i(the)1673 4673 y(\\)p Fd(*)p Fl(")41
b(sp)s(eci\014cation\).)71 b(The)41 b(v)-5 b(alue)40
b(of)h(the)g(corresp)s(onding)1673 4786 y(elemen)m(t)31
b(of)f Fd(AXIS)p 2310 4786 V 33 w(INFO)g Fl(is)f(implemen)m(tation)g
(dep)s(enden)m(t.)1503 4918 y Fd('CYCLIC')43 b Fl(The)20
b(axis)g(is)f(distributed)e Fd(CYCLIC)p Fl(.)i(The)h(corresp)s(ond-)
1673 5031 y(ing)29 b(elemen)m(t)i(of)g Fd(AXIS)p 2462
5031 V 33 w(INFO)e Fl(con)m(tains)i(the)f(blo)s(c)m(k)g(size.)1503
5164 y Fd('INDIRECT')42 b Fl(The)20 b(axis)g(is)f(distributed)f
Fd(INDIRECT\(map-array\))p Fl(.)1673 5277 y(The)23 b(v)-5
b(alue)24 b(of)g(the)g(corresp)s(onding)e(elemen)m(t)j(of)f
Fd(AXIS)p 3532 5277 V 33 w(INFO)1673 5390 y Fl(is)29
b(implemen)m(tation)g(dep)s(enden)m(t.)p eop
%%Page: 7 10
7 9 bop 150 -200 a Fg(0.1.)72 b(MAPPING)31 b(INQUIR)-8
b(Y)31 b(PR)m(OCEDURES)1792 b Fl(7)423 99 y Fd(AXIS)p
621 99 29 4 v 33 w(INFO)29 b Fl(\(optional\))240 b(m)m(ust)25
b(b)s(e)g(a)i(rank)e(one)h(arra)m(y)g(of)g(t)m(yp)s(e)g(default)f(in)m
(teger,)i(and)e(size)1503 211 y(at)43 b(least)f(equal)g(to)h(the)g
(rank)e(of)i(the)f Fc(align-tar)-5 b(get)52 b Fl(to)43
b(whic)m(h)1503 324 y Fd(DISTRIBUTEE)27 b Fl(is)i(ultimately)g(aligned)
g(\(whic)m(h)g(is)g(returned)g(b)m(y)1503 437 y Fd(HPF)p
1653 437 V 33 w(TEMPLATE)22 b Fl(in)i Fd(TEMPLATE)p 2577
437 V 32 w(RANK)p Fl(\).)g(It)g(is)g(an)g Fd(INTENT)46
b(\(OUT\))1503 550 y Fl(argumen)m(t.)88 b(The)46 b(i)2221
517 y Fb(th)2318 550 y Fl(elemen)m(t)h(of)f Fd(AXIS)p
2987 550 V 34 w(INFO)e Fl(con)m(tains)j(the)1503 663
y(blo)s(c)m(k)23 b(size)h(in)f(the)h(blo)s(c)m(k)g(or)g(cyclic)g
(distribution)c(of)k(the)h(i)3498 630 y Fb(th)3595 663
y Fl(axis)1503 776 y(of)33 b(the)f(ultimate)g Fc(align-tar)-5
b(get)43 b Fl(of)33 b Fd(DISTRIBUTEE)p Fl(;)d(if)h(that)i(axis)1503
889 y(is)e(a)i(collapsed)f(axis,)h(then)f(the)h(v)-5
b(alue)32 b(is)g(implemen)m(tation)f(de-)1503 1002 y(p)s(enden)m(t.)423
1164 y Fd(PROCESSORS)p 909 1164 V 31 w(RANK)f Fl(\(optional\))45
b(m)m(ust)40 b(b)s(e)g(scalar)g(and)g(of)g(t)m(yp)s(e)h(default)f(in)m
(teger.)71 b(It)40 b(is)f(set)1503 1276 y(to)49 b(the)h(rank)e(of)h
(the)h(pro)s(cessor)e(arrangemen)m(t)i(on)m(to)g(whic)m(h)1503
1389 y Fd(DISTRIBUTEE)35 b Fl(is)i(distributed.)61 b(It)38
b(is)f(an)h Fd(INTENT)46 b(\(OUT\))37 b Fl(ar-)1503 1502
y(gumen)m(t.)423 1664 y Fd(PROCESSORS)p 909 1664 V 31
w(SHAPE)29 b Fl(\(optional\))46 b(m)m(ust)31 b(b)s(e)f(a)i(rank)e(one)i
(arra)m(y)f(of)g(t)m(yp)s(e)h(default)e(in)m(teger)i(and)1503
1777 y(of)26 b(size)g(at)g(least)g(equal)g(to)h(the)f(v)-5
b(alue,)26 b Fi(m)p Fl(,)h(returned)e(in)f Fd(PROCES)p
Fl(-)1503 1890 y Fd(SORS)p 1701 1890 V 33 w(RANK)p Fl(.)31
b(It)g(is)g(an)h Fd(INTENT)46 b(\(OUT\))30 b Fl(argumen)m(t.)45
b(Its)31 b(\014rst)g Fi(m)1503 2003 y Fl(elemen)m(ts)38
b(are)h(set)g(to)g(the)g(shap)s(e)e(of)i(the)f(pro)s(cessor)g(arrange-)
1503 2116 y(men)m(t)j(on)m(to)g(whic)m(h)e Fd(DISTRIBUTEE)f
Fl(is)h(mapp)s(ed.)70 b(\(It)41 b(ma)m(y)g(b)s(e)1503
2228 y(necessary)31 b(to)h(call)e Fd(HPF)p 2335 2228
V 34 w(DISTRIBUTION)e Fl(t)m(wice,)k(the)f(\014rst)f(time)1503
2341 y(to)h(obtain)e(the)i(v)-5 b(alue)30 b(of)g Fd(PROCESSORS)p
2877 2341 V 32 w(RANK)f Fl(in)g(order)g(to)i(allo-)1503
2454 y(cate)h Fd(PROCESSORS)p 2181 2454 V 31 w(SHAPE)p
Fl(.\))423 2616 y Fd(PLB)d Fl(\(optional\))513 b(m)m(ust)34
b(b)s(e)g(a)g(rank)g(one)h(arra)m(y)g(of)f(t)m(yp)s(e)h(default)e(in)m
(teger)i(and)f(of)1503 2729 y(size)j(at)i(least)f(equal)g(to)g(the)g
(rank)g(of)g(DISTRIBUTEE.)f(It)h(is)1503 2842 y(an)43
b Fd(INTENT)j(\(OUT\))c Fl(argumen)m(t.)79 b(The)43 b(i)2964
2809 y Fb(th)3062 2842 y Fl(elemen)m(t)g(is)f(set)i(to)1503
2955 y(the)g(smallest)g(pro)s(cessor)g(index)f(ONTO)g(whic)m(h)g(the)i
(i)3498 2922 y Fb(th)3595 2955 y Fl(axis)1503 3068 y(of)38
b(DISTRIBUTEE)g(is)g(mapp)s(ed;)j(if)d(that)h(axis)f(is)g(collapsed,)
1503 3181 y(then)21 b(the)g(corresp)s(onding)e(elemen)m(t)j(of)g(PLB)f
(is)f(implemen)m(tation)1503 3293 y(dep)s(enden)m(t.)423
3455 y Fd(PUB)29 b Fl(\(optional\))513 b(m)m(ust)34 b(b)s(e)g(a)g(rank)
g(one)h(arra)m(y)g(of)f(t)m(yp)s(e)h(default)e(in)m(teger)i(and)f(of)
1503 3568 y(size)j(at)i(least)f(equal)g(to)g(the)g(rank)g(of)g
(DISTRIBUTEE.)f(It)h(is)1503 3681 y(an)24 b Fd(INTENT)46
b(\(OUT\))24 b Fl(argumen)m(t.)39 b(The)24 b(i)2868 3648
y Fb(th)2966 3681 y Fl(elemen)m(t)h(is)f(set)h(to)h(the)1503
3794 y(largest)k(pro)s(cessor)f(index)f(ONTO)h(whic)m(h)f(the)h(i)3182
3761 y Fb(th)3280 3794 y Fl(axis)g(of)h(DIS-)1503 3907
y(TRIBUTEE)25 b(is)g(mapp)s(ed;)h(if)f(that)i(axis)e(is)g(collapsed,)h
(then)g(the)1503 4020 y(corresp)s(onding)h(elemen)m(t)j(of)f(PUB)h(is)e
(implemen)m(tation)g(dep)s(en-)1503 4133 y(den)m(t.)423
4294 y Fd(PSTRIDE)g Fl(\(optional\))322 b(m)m(ust)34
b(b)s(e)g(a)g(rank)g(one)h(arra)m(y)g(of)f(t)m(yp)s(e)h(default)e(in)m
(teger)i(and)f(of)1503 4407 y(size)j(at)i(least)f(equal)g(to)g(the)g
(rank)g(of)g(DISTRIBUTEE.)f(It)h(is)1503 4520 y(an)43
b Fd(INTENT)j(\(OUT\))c Fl(argumen)m(t.)79 b(The)43 b(i)2964
4487 y Fb(th)3062 4520 y Fl(elemen)m(t)g(is)f(set)i(to)1503
4633 y(the)28 b(in)m(terpro)s(cessor)f(stride)g(in)g(the)h(ONTO)g
(clause)f(with)g(whic)m(h)1503 4746 y(the)32 b(i)1687
4713 y Fb(th)1785 4746 y Fl(axis)g(of)g(DISTRIBUTEE)g(is)f(mapp)s(ed;)i
(if)e(that)i(axis)f(is)1503 4859 y(collapsed,)37 b(then)e(the)i
(corresp)s(onding)d(elemen)m(t)j(of)f(PSTRIDE)1503 4972
y(is)29 b(set)i(to)g(zero.)423 5181 y Fe(Example.)36
b Fl(Giv)m(en)23 b(the)g(declarations)f(in)f(the)i(example)f(of)h
(Section)g(0.1.2,)j(and)c(assuming)f(that)423 5294 y(the)34
b(actual)h(mappings)e(are)i(as)f(the)h(directiv)m(es)f(sp)s(ecify)-8
b(,)34 b(the)h(results)e(of)i Fd(HPF)p 3150 5294 V 33
w(DISTRIBUTION)423 5407 y Fl(are:)p eop
%%Page: 8 11
8 10 bop 150 -200 a Fl(8)3039 b Fg(CONTENTS)p 462 11
2976 4 v 460 110 4 100 v 1434 110 V 1849 80 a Fa(A)p
2322 110 V 840 w(B)p 3235 110 V 484 w(PI)p 3436 110 V
462 113 2976 4 v 462 130 V 460 230 4 100 v 512 200 a(AXIS)p
717 200 25 4 v 31 w(TYPE)p 1434 230 4 100 v 507 w(['BLOCK',)26
b('BLOCK'])p 2322 230 V 99 w(['CYCLIC',)i('BLOCK'])p
3235 230 V 98 w([)56 b(])p 3436 230 V 462 233 2976 4
v 460 333 4 100 v 512 303 a(AXIS)p 717 303 25 4 v 31
w(INF)n(O)p 1434 333 4 100 v 797 w([10,)26 b(10])p 2322
333 V 658 w([1,)h(15])p 3235 333 V 394 w([)56 b(])p 3436
333 V 462 336 2976 4 v 460 436 4 100 v 512 406 a(PR)n(OCESSORS)p
1079 406 25 4 v 28 w(SHAPE)p 1434 436 4 100 v 404 w([4,)27
b(2])p 2322 436 V 720 w([4,)h(2])p 3235 436 V 415 w([)56
b(])p 3436 436 V 462 439 2976 4 v 460 539 4 100 v 512
509 a(PR)n(OCESSORS)p 1079 509 25 4 v 28 w(RANK)p 1434
539 4 100 v 507 w(2)p 2322 539 V 859 w(2)p 3235 539 V
514 w(0)p 3436 539 V 462 542 2976 4 v 150 754 a Ff(0.1.5)97
b(MAP)p 665 754 30 4 v 35 w(ARRA)-8 b(Y\(DISTRIBUTEE,)32
b(DIM\))423 927 y Fe(Optional)i(Argumen)m(ts.)40 b Fl(DIM.)423
1141 y Fe(Description.)h Fl(Returns)30 b(the)g(map)g(arra)m(y)h(for)f
(a)h(sp)s(eci\014ed)e(axis)h(of)g(an)g(arra)m(y)-8 b(.)423
1355 y Fe(Class.)40 b Fl(Mapping)29 b(inquiry)f(function.)423
1570 y Fe(Argumen)m(ts.)423 1759 y Fd(DISTRIBUTEE)552
b Fl(ma)m(y)30 b(b)s(e)g(of)g(an)m(y)g(t)m(yp)s(e.)41
b(It)30 b(ma)m(y)h(b)s(e)e(scalar)h(or)g(arra)m(y)g(v)-5
b(alued.)40 b(It)1503 1872 y(m)m(ust)22 b(not)h(b)s(e)f(an)g
(assumed-size)g(arra)m(y)-8 b(.)39 b(If)22 b(it)g(is)g(a)h(mem)m(b)s
(er)e(of)i(an)1503 1985 y(aggregate)41 b(v)-5 b(ariable)36
b(group,)k(then)d(it)g(m)m(ust)h(b)s(e)f(an)h(aggregate)1503
2098 y(co)m(v)m(er)k(of)e(the)h(group.)70 b(\(See)41
b(Section)f Fe(??)h Fl(for)f(the)g(de\014nitions)1503
2211 y(of)29 b(\\aggregate)k(v)-5 b(ariable)28 b(group")h(and)g
(\\aggregate)k(co)m(v)m(er."\))43 b(It)1503 2323 y(m)m(ust)28
b(not)h(b)s(e)f(a)h(p)s(oin)m(ter)e(that)i(is)f(disasso)s(ciated)g(or)g
(an)h(allo)s(cat-)1503 2436 y(able)39 b(arra)m(y)i(that)f(is)f(not)h
(allo)s(cated.)69 b(It)40 b(is)f(an)h Fd(INTENT)46 b(\(IN\))1503
2549 y Fl(argumen)m(t.)1503 2696 y(If)35 b Fd(DISTRIBUTEE)e
Fl(is)h(a)i(p)s(oin)m(ter,)h(information)d(ab)s(out)h(the)h(dis-)1503
2809 y(tribution)d(of)j(its)f(target)i(is)e(returned.)55
b(The)35 b(target)i(m)m(ust)f(not)1503 2922 y(b)s(e)d(an)i
(assumed-size)e(dumm)m(y)h(argumen)m(t)g(or)g(a)h(section)g(of)f(an)
1503 3035 y(assumed-size)j(dumm)m(y)g(argumen)m(t.)64
b(If)37 b(the)h(target)h(is)e(\(a)i(sec-)1503 3148 y(tion)c(of)7
b(\))36 b(a)g(mem)m(b)s(er)g(of)g(an)f(aggregate)k(v)-5
b(ariable)34 b(group,)j(then)1503 3261 y(the)30 b(mem)m(b)s(er)g(m)m
(ust)g(b)s(e)g(an)g(aggregate)k(co)m(v)m(er)e(of)e(the)h(group.)423
3425 y Fd(DIM)936 b Fl(m)m(ust)25 b(b)s(e)f(scalar)h(and)f(of)h(t)m(yp)
s(e)g(default)f(in)m(teger.)40 b(Its)25 b(v)-5 b(alue)24
b(m)m(ust)1503 3538 y(b)s(e)33 b(b)s(et)m(w)m(een)h(one)g(and)e(the)i
(rank)f(of)h(DISTRIBUTEE,)f(unless)1503 3651 y(DISTRIBUTEE)k(is)g
(scalar,)j(in)d(whic)m(h)g(case)i(it)f(m)m(ust)g(not)h(b)s(e)1503
3764 y(presen)m(t.)423 3978 y Fe(Result)f(T)m(yp)s(e,)h(T)m(yp)s(e)f(P)
m(arameter,)f(and)h(Shap)s(e.)49 b Fl(The)33 b(result)f(is)g(a)h(rank)g
(one)g(arra)m(y)h(of)423 4091 y(t)m(yp)s(e)e(default)f(in)m(teger)i
(and)f(size)g(equal)f(to)i(the)g(exten)m(t)g(of)g(axis)e(DIM)i(of)f
(DISTRIBUTEE;)g(if)423 4204 y(DISTRIBUTEE)d(is)h(scalar,)g(then)g(the)h
(result)e(is)h(of)g(size)g(one.)423 4418 y Fe(Result)e(v)-6
b(alue.)39 b Fl(Elemen)m(t)24 b(i)f(of)i(the)f(result)g(is)f(the)h(pro)
s(cessor)g(index)f(to)i(whic)m(h)e(the)i(i)3347 4385
y Fb(th)3444 4418 y Fl(elemen)m(t)423 4531 y(of)38 b(DISTRIBUTEE)g
(along)g(axis)g(DIM)g(is)g(mapp)s(ed.)63 b(If)38 b(axis)f(DIM)i(of)g
(DISTRIBUTEE)e(is)423 4644 y(collapsed,)29 b(then)h(all)g(elemen)m(ts)g
(of)h(the)g(result)e(ha)m(v)m(e)i(the)g(v)-5 b(alue)30
b(one.)150 4890 y Ff(0.1.6)97 b(BLOCK)p 773 4890 V 35
w(SIZES\(DISTRIBUTEE,)31 b(DIM\))423 5062 y Fe(Optional)j(Argumen)m
(ts.)40 b Fl(DIM.)423 5277 y Fe(Description.)h Fl(Returns)30
b(the)g(arra)m(y)h(of)f(blo)s(c)m(k)g(sizes)g(for)g(a)h(sp)s(eci\014ed)
d(blo)s(c)m(k-distribtued)f(axis)423 5390 y(of)j(an)h(arra)m(y)-8
b(.)p eop
%%Page: 9 12
9 11 bop 150 -200 a Fg(0.1.)72 b(MAPPING)31 b(INQUIR)-8
b(Y)31 b(PR)m(OCEDURES)1792 b Fl(9)423 99 y Fe(Class.)40
b Fl(Mapping)29 b(inquiry)f(function.)423 311 y Fe(Argumen)m(ts.)423
499 y Fd(DISTRIBUTEE)552 b Fl(ma)m(y)26 b(b)s(e)f(of)h(an)m(y)g(t)m(yp)
s(e.)39 b(It)26 b(m)m(ust)g(b)s(e)f(arra)m(y)h(v)-5 b(alued.)38
b(It)26 b(m)m(ust)g(not)1503 612 y(b)s(e)31 b(an)i(assumed-size)e(arra)
m(y)-8 b(.)48 b(If)31 b(it)h(is)f(a)i(mem)m(b)s(er)f(of)g(an)g(aggre-)
1503 724 y(gate)25 b(v)-5 b(ariable)23 b(group,)h(then)g(it)f(m)m(ust)h
(b)s(e)f(an)h(aggregate)i(co)m(v)m(er)g(of)1503 837 y(the)33
b(group.)47 b(\(See)33 b(Section)g Fe(??)g Fl(for)g(the)g
(de\014nitions)d(of)j(\\aggre-)1503 950 y(gate)27 b(v)-5
b(ariable)25 b(group")h(and)f(\\aggregate)30 b(co)m(v)m(er."\))42
b(It)26 b(m)m(ust)g(not)1503 1063 y(b)s(e)j(a)i(p)s(oin)m(ter)e(that)i
(is)f(disasso)s(ciated)f(or)h(an)g(allo)s(catable)g(arra)m(y)1503
1176 y(that)h(is)e(not)i(allo)s(cated.)40 b(It)31 b(is)e(an)i
Fd(INTENT)46 b(\(IN\))29 b Fl(argumen)m(t.)1503 1322
y(If)35 b Fd(DISTRIBUTEE)e Fl(is)h(a)i(p)s(oin)m(ter,)h(information)d
(ab)s(out)h(the)h(dis-)1503 1435 y(tribution)d(of)j(its)f(target)i(is)e
(returned.)55 b(The)35 b(target)i(m)m(ust)f(not)1503
1548 y(b)s(e)d(an)i(assumed-size)e(dumm)m(y)h(argumen)m(t)g(or)g(a)h
(section)g(of)f(an)1503 1661 y(assumed-size)j(dumm)m(y)g(argumen)m(t.)
64 b(If)37 b(the)h(target)h(is)e(\(a)i(sec-)1503 1774
y(tion)c(of)7 b(\))36 b(a)g(mem)m(b)s(er)g(of)g(an)f(aggregate)k(v)-5
b(ariable)34 b(group,)j(then)1503 1887 y(the)30 b(mem)m(b)s(er)g(m)m
(ust)g(b)s(e)g(an)g(aggregate)k(co)m(v)m(er)e(of)e(the)h(group.)423
2050 y Fd(DIM)936 b Fl(m)m(ust)25 b(b)s(e)f(scalar)h(and)f(of)h(t)m(yp)
s(e)g(default)f(in)m(teger.)40 b(Its)25 b(v)-5 b(alue)24
b(m)m(ust)1503 2162 y(b)s(e)d(b)s(et)m(w)m(een)i(one)f(and)f(the)i
(rank)e(of)h(DISTRIBUTEE.)g(The)f(cor-)1503 2275 y(resp)s(onding)26
b(axis)i(of)g(DISTRIBUTEE)g(m)m(ust)g(ha)m(v)m(e)i(a)f(BLOCK)1503
2388 y(distribution.)423 2601 y Fe(Result)46 b(T)m(yp)s(e,)j(T)m(yp)s
(e)d(P)m(arameter,)h(and)f(Shap)s(e.)70 b Fl(The)39 b(result)g(is)g(a)i
(rank)e(one)h(arra)m(y)423 2714 y(of)e(t)m(yp)s(e)g(default)e(in)m
(teger)j(and)e(size)g(equal)h(to)g(the)g(exten)m(t)h(of)f(axis)f(DIM)i
(of)f(the)f(pro)s(cessors)423 2827 y(arrangemen)m(t)31
b(on)m(to)h(whic)m(h)d(DISTRIBUTEE)g(is)h(distributed.)423
3039 y Fe(Result)j(v)-6 b(alue.)41 b Fl(The)28 b(result)g(is)g(the)i(v)
m(ector)g(of)g(blo)s(c)m(k)e(sizes)h(used)f(to)i(map)f(the)g(sp)s
(eci\014ed)e(axis)423 3152 y(of)36 b(DISTRIBUTEE.)f(If)g(the)i
(indicated)d(axis)h(of)h(DISTRIBUTEE)f(do)s(es)h(not)g(ha)m(v)m(e)h(a)f
(blo)s(c)m(k)423 3265 y(mapping,)29 b(the)h(result)g(is)f(implemen)m
(tation)g(dep)s(enden)m(t.)p eop
%%Trailer
end
userdict /end-hook known{end-hook}if
%%EOF
---------------------------------------------------------------------------
To (un)subscribe to this list, send mail to
hpff-distribute-request@cs.rice.edu.
Leave the subject line blank, and in the body put the line
(un)subscribe <email-address>
---------------------------------------------------------------------------

From owner-hpff-distribute  Fri Jan  5 10:47:20 1996
Received: (from daemon@localhost) by cs.rice.edu (8.7.1/8.7.1) id KAA26621 for hpff-distribute-out; Fri, 5 Jan 1996 10:47:20 -0600 (CST)
Received: from beech.soton.ac.uk (beech.soton.ac.uk [152.78.128.78]) by cs.rice.edu (8.7.1/8.7.1) with SMTP id KAA26601 for <hpff-distribute@cs.rice.edu>; Fri, 5 Jan 1996 10:47:07 -0600 (CST)
Received: from bright.ecs.soton.ac.uk (bright.ecs.soton.ac.uk [152.78.64.201])
   by beech.soton.ac.uk (8.6.12/hub-8.5a) with SMTP id QAA00124
   for <hpff-distribute%cs.rice.edu@relay.soton.ac.uk>; Fri, 5 Jan 1996 16:47:04 GMT
Received: from diana.ecs.soton.ac.uk by bright.ecs.soton.ac.uk; Fri, 5 Jan 96 16:48:18 GMT
From: John Merlin <jhm@ecs.soton.ac.uk>
Message-Id: <3678.199601051647@diana.ecs.soton.ac.uk>
Subject: hpff-distribute: Thoughts on HPF2 and 2000
To: hpff-distribute@cs.rice.edu
Date: Fri, 5 Jan 1996 16:47:34 +0000 (GMT)
Cc: jhm@ecs.soton.ac.uk (John Merlin)
X-Mailer: ELM [version 2.4 PL24]
Content-Type: text
Sender: owner-hpff-distribute
Precedence: bulk

---------------------------------------------------------------------------
hpff-distribute@cs.rice.edu is a mailing list for discussion of data
distribution in High Performance Fortran.  Instructions for adding or
deleting yourself from this list appear at the bottom of this message.
---------------------------------------------------------------------------

Hi,

I recently learnt of the HPF2.0 and HPF2000 proposals, and
thought I'd present some thoughts on them as input for the 
impending discussions.  

I'll start with the higher denomination standard first.

HPF2000
-------
My first impression was -- Wow!  To define HPF2000 in 1996,
four years early, is certainly a bold and far-sighted move!  
I can see the advantage.  It's nice to get things done ahead 
of schedule  (at least I imagine so -- I don't speak from personal 
experience you understand).

Despite this, I'd like to suggest an alternative idea.  (Sorry to 
be a spoilsport.)   That is, don't present this language as a standard
at all, but instead put everything that isn't in HPF2 in one
or more official HPF technical reports as proposals for the
standard to follow HPF2.  This would be in line with the procedure
that I believe has been adopted for Fortran evolution by the ANSI 
Fortran committee.  Roughly speaking (Jerry will have the full 
picture)  the idea is to use official TRs for features that if 
put into F96 would unduly delay its publication and implementation, 
but which are felt to be too important to forget altogether until 
F2000.  This way vendors have guidelines on useful extensions 
to F96, and they can be officially standardised in F2000 with 
the benefit of experience. 

Similarly for HPF.  Putting the new features in TRs means 
that users and the marketplace can test their usefulness,
efficiency, implementability, technical correctness, etc.  
The HPFF need be less concerned about getting every detail 
perfect, because implementation and use would iron out any
rough edges.  Then, come 2000, they can be incorporated in an
official HPF2000 standard with the benefit of experience, just
as Fortran and C generally standardise existing practice rather 
than defining totally new things.  If any of the proposed features 
aren't implemented by 2000, then clearly they aren't needed or are 
technically flawed, so they shouldn't go in the standard.
To paraphrase a paraphrase of a well-known saying:
"Premature optimisaton is the root of all evil".  As for the
name of this language, I suggest something like Extended
or Extra HPF, or HPF+, etc -- don't put a date on it.

The argument against this approach is that it's nice to put
everything in a standard so that users can rely on them being 
universally available.  However, the name HPF2000 is an open 
admission that this won't be the case for another four years.  
Given that, the TR approach seems sensible.

HPF2.0
------
I can understand the desire to make the next full HPF standard
some sort of subset of HPF1.1, so that users have something they
can rely on being implemented and universally available.  

However, I was alarmed by the suggestion that the offical 'Subset 
HPF' would somehow cease to exist.  I don't know how you can 
undefine a published standard, even an unofficial one, and it's 
unfair on users and implementors alike, and damages credibility, 
to shift the goalposts like this.  My chagrin was heightened by 
the fact that we've recently announced a public domain implementation 
of Subset HPF (see the advert at the end of this message!), and
were proud of the fact that we've implemented the data mapping
features in virtually their full generality.  I didn't expect 
all the interesting bits to be eliminated from the next HPF 
standard, given that this is the core and most important part of HPF.

Given that HPF2 will effectively be the real standard for 
some years to come, so realistically users will have to restrict
themselves to what's in it, I believe it shouldn't be too spartan 
and should include at least all of the alignment and distribution 
features in Subset HPF.  This also reasonable given that
Subset HPF is what most users and implementors have been
targetting so far.  I'll now try to give an even more cogent 
argument for this.

Firstly, I don't think the proposed criterion for including
features in HPF2 (that they "give high performance on all
platforms") is a good one.  It seems like a cop out by vendors.
A better criterion is to include the minimal set of features 
necessary to allow programs to execute with the highest 
(reasonably achievable) performance.  E.g., although CYCLIC (N) 
distributions may be slower than BLOCK in a direct comparison, 
there will be applications for which the use of CYCLIC (N) will 
give better performance than being forced to use a simple BLOCK 
distribution.  The HPF philosophy is that the user has to 
experiment to get optimum efficiency;  I doubt if the user will
use relatively inefficient features like strided alignment 
unecessarily, so I don't see why we should protect him/her from it.

On the basis of this argument, and the fact that these features 
have already been widely implemented so obviously aren't too hard 
to provide, I'd like to argue for the re-introduction of
general alignments and distributions.  Some justifications:

-- Alignment offsets and strides are needed to describe the
distribution of an array section when it is passed as an actual 
argument into a procedure.  In this way no data movement is
required, and the mapping is still explicitly specified inside
the procedure.  Without this facility the argument would
either have to be remapped on entry and exit, so that it has a simple
mapping that can be described without alignment, or the mapping
would have to be inherited (which is probably also disallowed,
and is certainly less efficient than explicitly specifying the
mapping).  I gave an example of this for Gauss elimination in a 
Sci. Prog.  paper about HPF a while back.

-- Alignment axis permutation is needed to efficiently implement
references like:
   FORALL (i=...,j=...) a (i,j) = b (j,i)

Anyway, I don't understand what complication or inefficieny this
facility could introduce.  Can someone explain?

-- Embedded alignment, e.g.:
     ALIGN s WITH a(m,n)
is needed to allow fine-scale control of where data is stored
and thus where computations are performed, and can avoid
unecessary communications.  For example, in Gaussian elimination 
with pivotting, intermediate values of the pivot element and value 
can be stored and computed just on the processor owning 
the column in question, and the final values can then be
broadcast by assigning them to globally replicated scalars. 
If one could not embed the variables holdinh the intermediate 
values on a particular processor, they would be globally broadcast 
at each step of the pivot search, with massive overhead.  Using
an 'ON HOME' directive doesn't solve this problem;  though the 
computation can be localised, the intermediate results are still 
broadcast if assigned to a globally replicated variable, as they 
must be to preserve HPF semantics.  (I got this example from a 
paper I reviewed, which found that the embedding solution gave 
immensely better performance.)

-- '*'s in the alignment are needed to specify partial replication, 
e.g. replicating a vector over dimension 1 of a 2d processor array 
and distributing it over dim 2.  Surely there is no debate over
the usefulness of this.
 
Thus, I argue for keeping Subset HPF's general alignment and
distribution features in HPF2. 
 
I have just two other comments on features for inclusion in
HPF2:

-- Why is it necessary for HPF2's base language to be full F90
(or F96), rather than the F90 subset selected for Subset HPF?  
True, I expect most large vendors will wish to provide full F96 
along with HPF, but they could do this anyway
even if HPF2 only required Subset F90.  (Perhaps they could
distinguish that their HPF implementation supports full F96 by
calling it HPF96 rather than just HPF2, for instance).

The problem I percieve with requiring full F96 as a basis
is that it tends to exclude small-scale research and academic 
efforts, which may well provide public domain implementations 
(e.g. shpf and ADAPTOR), from being legitamately calling
themselves HPF.  I think public domain implementations can 
greatly help to prime the market for HPF, by providing free
development and testing systems to get people interested, and
for education purposes, etc.  Thus I think the HPFF should
support and facilitate such efforts rather than putting big
hurdles in the way.

Also, some vendors may wish to expend more effort on the HPF
features important for performance (like general data mapping
support!) rather than nice but relatively unimportant F90
features.  Finally, F96 does introduce some extra complications
for HPF, like pointers, arrays-of-arrays, etc.  I'm not
convinced these have been well sorted-out, nor do I think they
are trivial.

-- I agree with the removal of sequence and storage association, 
and the SEQUENCE directive.  This is one area where Subset HPF 
provided features that were guaranteed to give low performance, 
and were extremely hard to implement in full generality.

Also, of course, I support the introduction of PURE procedures
to HPF2!

-- Finally, since we seem to be in the business of tweaking and
correcting the last HPF standard, I'd like to plead again
for common blocks to be disallowed inside pure procedures.
(Please, don't sigh so loud Chuck! :-)).  In fact they only
cause problems if they contain distributed data (much like
sequence and storage association), so could be allowed
otherwise, but for regularity it's probably prefereble to
disallow them altogether, in HPF2 at least.

Without common blocks, pure procedures are trivial to implement,
and very useful for getting high efficiency in many
circumstances as they permit functiional parallelism in FORALLs
(or indeed in array syntax, using F96 ELEMENTAL procedures).
However, by allowing them to access external data that may be
stored on a different processor to that executing the pure
procedure, they violate one of the rules of Kernel HPF, namely,
that features should "allow high performance across all platforms",
because they become extremely hard (or perhaps virtually
impossible) to implement on distributed memory architectures,
which is still an important architecural class for HPF
(e.g. workstation networks).  Has anybody actually implemented
pure procedures in their full generality, with global data
accesses allowed, on any DM platforms yet?

Furthermore, I notice that the desire for 'purer than pure' 
procedures has been voiced in several contexts at recent HPF 
meetings.  Perhaps this is the time to bite the bullet and add 
this constraint.

That's all for now, you'll be pleased to know.

Wishing you all a Happy and High Performance New Year,
                               John.
 

P.S.  And now for that advert I promised.  'shpf', a Subset
High Performance Fortran compilation system, is now freely
available by anonymous ftp from:

   ftp.hpcc.soton.ac.uk  in directory  /pub/packages/shpf.

It supports arbitrary alignments and distributions, in any
number of dimensions, in virtually any context (for what
it's worth!).  Full information is (or shortly will be)
available on the WWW at URL:
   http://www.hpcc.ecs.soton.ac.uk/shpf/shpf.html.

Please spread the good news to your friends and colleagues, 
and enjoy it!
-----------------------------------------------------------
John Merlin,                                 jhm@ecs.soton.ac.uk
Dept of Electronics and Computer Science,    tel:  +44 1703 593943
University of Southampton,                   fax:  +44 1703 593045
Southampton, SO17 1BJ, U.K.
---------------------------------------------------------------------------
To (un)subscribe to this list, send mail to
hpff-distribute-request@cs.rice.edu.
Leave the subject line blank, and in the body put the line
(un)subscribe <email-address>
---------------------------------------------------------------------------

From owner-hpff-distribute  Mon Jan  8 06:49:29 1996
Received: (from daemon@localhost) by cs.rice.edu (8.7.1/8.7.1) id GAA18284 for hpff-distribute-out; Mon, 8 Jan 1996 06:49:29 -0600 (CST)
Received: from beech.soton.ac.uk (beech.soton.ac.uk [152.78.128.78]) by cs.rice.edu (8.7.1/8.7.1) with SMTP id GAA18158 for <hpff-distribute@cs.rice.edu>; Mon, 8 Jan 1996 06:46:28 -0600 (CST)
Received: from bright.ecs.soton.ac.uk (bright.ecs.soton.ac.uk [152.78.64.201])
   by beech.soton.ac.uk (8.6.12/hub-8.5a) with SMTP id MAA00814
   for <hpff-distribute%cs.rice.edu@relay.soton.ac.uk>; Mon, 8 Jan 1996 12:46:11 GMT
Received: from landlord.ecs.soton.ac.uk by bright.ecs.soton.ac.uk; Mon, 8 Jan 96 12:41:47 GMT
From: John Merlin <jhm@ecs.soton.ac.uk>
Received: from bacchus.ecs.soton.ac.uk by landlord.ecs.soton.ac.uk; Mon, 8 Jan 96 12:41:21 GMT
Message-Id: <707.9601081241@bacchus.ecs.soton.ac.uk>
Subject: Re: hpff-distribute: Thoughts on HPF2 and 2000
To: hpff-distribute@cs.rice.edu
Date: Mon, 8 Jan 1996 12:41:20 +0000 (GMT)
In-Reply-To: <3678.199601051647@diana.ecs.soton.ac.uk> from "John Merlin" at Jan 5, 96 04:47:34 pm
X-Mailer: ELM [version 2.4 PL0]
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Sender: owner-hpff-distribute
Precedence: bulk

---------------------------------------------------------------------------
hpff-distribute@cs.rice.edu is a mailing list for discussion of data
distribution in High Performance Fortran.  Instructions for adding or
deleting yourself from this list appear at the bottom of this message.
---------------------------------------------------------------------------

I just noticed a terrible mistake in my my last message...

> To paraphrase a paraphrase of a well-known saying:
> "Premature optimisaton is the root of all evil".  As for the
             ^^^^^^^^^^^
I meant 'standardisation' of course.  Sorry for any confusion.

                John.
---------------------------------------------------------------------------
To (un)subscribe to this list, send mail to
hpff-distribute-request@cs.rice.edu.
Leave the subject line blank, and in the body put the line
(un)subscribe <email-address>
---------------------------------------------------------------------------

From owner-hpff-distribute  Mon Jan 15 18:49:41 1996
Received: (from daemon@localhost) by cs.rice.edu (8.7.1/8.7.1) id SAA18634 for hpff-distribute-out; Mon, 15 Jan 1996 18:49:41 -0600 (CST)
Received: from hplms26.hpl.hp.com (hplms26.hpl.hp.com [15.255.168.31]) by cs.rice.edu (8.7.1/8.7.1) with ESMTP id SAA18625; Mon, 15 Jan 1996 18:49:38 -0600 (CST)
Received: from hplpp3.hpl.hp.com by hplms26.hpl.hp.com with ESMTP
	($Revision: 1.36.108.11 $/15.5+ECS 3.3+HPL1.1S) id AA190723376; Mon, 15 Jan 1996 16:49:37 -0800
Received: by hplpp3.hpl.hp.com
	(1.37.109.14/15.5+ECS 3.3+HPL1.1) id AA095263381; Mon, 15 Jan 1996 16:49:41 -0800
Date: Mon, 15 Jan 1996 16:49:41 -0800
From: Rob Schreiber <schreibr@hplpp3.hpl.hp.com>
Message-Id: <199601160049.AA095263381@hplpp3.hpl.hp.com>
To: hpff-interpret@cs.rice.edu
Subject: hpff-distribute: pointers, mapping etc
Cc: hpff-distribute@cs.rice.edu
Sender: owner-hpff-distribute
Precedence: bulk

---------------------------------------------------------------------------
hpff-distribute@cs.rice.edu is a mailing list for discussion of data
distribution in High Performance Fortran.  Instructions for adding or
deleting yourself from this list appear at the bottom of this message.
---------------------------------------------------------------------------


There seems to be a lot of confusion about what mappings pointers can have.
I hope the distribution group will tackle this and produce something
we all understand and IBM will implement.

The issues are these:

1.   There seems to be no appetite anymore for any ambiguity as to mapping.
That is why realign and redistribute and maybe inherit are on there way out.
Thus, pointers that assume the mapping of their targets are viewed as bad.
Since pointers must agree with their targets as to type and rank, the obvious solution is to
give pointers mappings statically (at the declaration) and to require that the target
have an identical mapping.   This would apply to the allocated object if the pointer is used
in an allocate.  Why is this tricky?

1.   What if the pointer and target have imprecise mappings, with something
left to the compiler:

     real, pointer :: p(:,:)
     real x(100,100)
     !hpf$ distribute (block, block) :: x, p

The compiler might choose different processors arrangements.

2.   How do I generate and map linked structures one cell at a time?
A reasonable HPF answer might be "Use some other programming language."

3.  I dont see distribution ranges as the right answer here.   In fact,
with these rules and without dynamic mapping (and inherit?) there is no
need for them.


---------------------------------------------------------------------------
To (un)subscribe to this list, send mail to
hpff-distribute-request@cs.rice.edu.
Leave the subject line blank, and in the body put the line
(un)subscribe <email-address>
---------------------------------------------------------------------------

From owner-hpff-distribute  Mon Jan 22 15:16:10 1996
Received: (from daemon@localhost) by cs.rice.edu (8.7.1/8.7.1) id PAA06169 for hpff-distribute-out; Mon, 22 Jan 1996 15:16:10 -0600 (CST)
Received: from fontainebleau.ensmp.fr (root@fontainebleau.ensmp.fr [192.54.148.100]) by cs.rice.edu (8.7.1/8.7.1) with SMTP id PAA06152 for <hpff-distribute@cs.rice.edu>; Mon, 22 Jan 1996 15:16:02 -0600 (CST)
Received: from cri.ensmp.fr (chailly.ensmp.fr) by fontainebleau.ensmp.fr with SMTP id AA25199
  (5.67a8/IDA-1.5 for <hpff-distribute@cs.rice.edu>); Mon, 22 Jan 1996 22:15:36 +0100
Received: from provins.caii by cri.ensmp.fr (4.1/SMI-4.0)
	id AA07995; Mon, 22 Jan 96 22:15:35 +0100
Date: Mon, 22 Jan 96 22:15:35 +0100
Message-Id: <9601222115.AA07995@cri.ensmp.fr>
Received: by provins.caii (4.1/SMI-4.1)
	id AA00727; Mon, 22 Jan 96 22:15:29 +0100
From: Fabien COELHO <coelho@chailly.ensmp.fr>
To: schreiber@hpl.hp.com
Subject: hpff-distribute: ASSUME directive proposal
Cc: hpff-distribute@cs.rice.edu
Sender: owner-hpff-distribute
Precedence: bulk

---------------------------------------------------------------------------
hpff-distribute@cs.rice.edu is a mailing list for discussion of data
distribution in High Performance Fortran.  Instructions for adding or
deleting yourself from this list appear at the bottom of this message.
---------------------------------------------------------------------------

Dear Rob,

>  There seems to be no appetite anymore for any ambiguity as to mapping.

This is just the point I want to address in this proposal! great!

> That is why realign and redistribute and maybe inherit are on there way
> out.

I do think that realign and redistribute can be kept and be useful by
disallowing mapping ambiguity. But this is another story.


I would like the following proposal to be discussed by the Forum for
possible addition to HPF-later and/or the kernel. Any comment from the
list is welcome, for sure.

The idea is to allow the user to specify several descriptive mappings for
a given argument to a subroutine. I already sent the suggestion once.
This one version is more formal. Design and implementation issues are
discussed more precisely. It is a possible alternative to some use of the
inherit directive. 

This proposal may replace the inherit directive in the kernel...

I talked with Thomas Brandes (Adaptor) last friday about implementation
issues of such a feature, and he agreed that it is not big a problem.
I guess all implementors would agree on that point. Thus the question is
more about the usefulness of the feature. 

Fabien.
--
Fabien COELHO __ http://www.cri.ensmp.fr/~coelho __ coelho@cri.ensmp.fr
  CRI, ENSMP, 35, rue Saint Honoré, 77305 Fontainebleau Cedex, France
     phone: 33 1 64 69 {voice: 48 52, fax: 47 09, standard: 47 08}
       ________  All opinions expressed here are mine  ________

%%%%%%%%%%

PROPOSAL: ASSUME (or whatever name you might prefer) directive
--------------------------------------------------------------


The aim of this proposal is NOT to add a new feature or directive to HPF,
but rather to promote good software engineering in HPF and to provide more
knowledge to the compiler about the mapping of data, in order to improve
the performances. This is in the spirit of HPF. 

The proposal does not add any new "semantics" to the language. It is just
designed to help the compiler simply and efficiently.


Outline:
--------

The idea is to allow to specify several descriptive mappings for
arguments at subroutine interfaces. It is an alternative to the inherit
directive as a mean to switch beetween several subroutines, depending on
the mapping of their arguments, to do the same job. It does not prevent
separate compilation. The compiler can take advantage of maximum static
knowledge when compiling the subroutines. The user is not required to
clone its own procedure by hand to specify several mappings for a
subroutine, and or to use the inherit stuff.


Syntax:
-------

assume-directive is 
    ASSUME
    list-of-or-separated-static-mapping-directives
    END ASSUME

list-of-or-separated-static-mapping-directives is
    list-of-static-mapping-directives
    [ OR list-of-or-separated-static-mapping-directives ]


Constraints:
------------

C1: declaration:

The assume-directive may appear within the declarations of the subroutine.
If so, it MUST also appear in the subroutine interface.


Notes:
------

N1: the list of mapping directives might be empty, meaning that non
distributed arrays may be used as arguments.

N2: there may be other mapping directives outside of the ASSUME scope.


Discussion:
-----------

Here are discussed some issues that could be switched to constraints...

D1: same order... ?

If C1, it must be the SAME order in the subroutine interface and
declarations. 

Rationale: this allow a simple naming convention for direct implementation
of the feature to be managed at compile/link-time in a cloning-based
approach. If the order is not a constraint, then a compile/link-time
management should be based on the mapping directives by adding some
computed suffix to the name of the subroutines compiled with the different
assumptions, and all names must be different... Thus requiring D4(a).
This issue is extensivelly discussed hereafter.


D2: several/nested ASSUME directives?

Might be allowed. It would then specify the cross product of mappings as
possible assumptions to be managed by the compiler. On the one hand, this
could shorten the mapping description for some subroutines. On the other
hand, it would allow the user to specify many cases to the compiler
without making him/her feel the cost of these many different assumptions.
Should the user be trusted? I guess so:-)


D3: mapping of local variables?

The mapping of local variables may be linked to the mapping of the
arguments, thus local variables may be specified a mapping within the
ASSUME directive. An align outside the assume scope might not be
necessarily sufficient. There is no significant impact on the
clone-based implementation. If local variables are allowed within the
assume scope in a subroutine, they must not appear in the subroutine
interface... 


D4: distinct descriptive mappings, or not?

(a) The different lists of mapping directives should contain distinct
descriptive mappings about the arguments of the subroutine, so that there
can be no ambiguity about the right "version" of the subroutine to call.

(b) Or no such constraints, and the first convenient version is chosen?

This has some impact on the possible implementations:
It would be desirable to reject the next example because only the
first set of directives would be used (would be the rationale for (a))"

      subroutine sub(A)
      real B ! B is local to sub
chpf$ assume
chpf$ distribute A(block)
chpf$ distribute B(block)
chpf$ or
chpf$ distribute A(block)
chpf$ distribute B(cyclic) ! inconsistent with the previous one...
chpf$ end assume

However (a) would prevent the example in D5 and a default prescriptive
case when non distributed data are also to be considered (see D6).
Thus I would prefer (b), but it requires D1 as a constraint, for simple
naming convention management and compile/link time handling.


D5: prescriptive mappings?

prescriptive mappings for some arguments of the subroutine may be allowed:
For instance: 

      subroutine sub(A(n),B(n))
chpf$ assume
chpf$ distribute A(block)
chpf$ distribute * B(cyclic) ! requires a remapping
chpf$ or
chpf$ distribute * A(cyclic) ! idem
chpf$ distribute B(block)
chpf$ end assume

However you would not like this case to be rejected because the compiler
cannot decide the right version to call if both A and B are block
distributed. The "take the first one" option would make sense here. 
The nature of the ambiguity here is quite similar to the one in D4, but
here it is not as useless...


D6: default?

The last option in the assume, under D4(b), can be used as a default case
with prescriptive arguments:

chpf$ assume
chpf$ or
chpf$ distribute A(cyclic)
chpf$ or 
chpf$ distribute * A(block)
chpf$ end assume

Ths would mean that A may be local or cyclic distributed, otherwise please
block-distribute it for the routine. Note that maybe it would not make
much sense to add a descriptive assumption about A as block-distributed,
because the default case should perform equally well (the remapping should
not be performed at runtime... maybe a simple copy... and the body of the
subroutine would be compiled with equal assumptions? I guess it depends on
the way prescriptive mappings are handled by the compiler).


Advices to users:
-----------------

The directive may be expensive at compile time because it may require 
to compile several times the routine with the different assumptions. 


Advices to implementers:
------------------------

To summarize the main issue in the discussion above: 

(1) the declaration order (in the assume or-list) is important:
    => very simple naming convention for compile/link-time handling,
       based on the occurence number.

(2) the declaration is not important AND distinct descriptive mappings
    => possible naming convention for compile/link-time handling
       a` la C++, but disallow interesting use of the feature (D5/D6)...

(3) the declaration order is not important
    => no simple compile/link-time handling. dynamic switching required:-(

My opinion: best is (1) [D1/D5/D6 and D4(b)]. 

It does not prevent some stupid set of directives to be supplied by the
user. Well, this is the problem of the user, it is not the main issue of a
language to prevent stupid use of features. It allows a direct and simple
compile/link-time implementation, what is highly desirable.

Thus the directive *can* (this is not mandatory) be implemented as follow: 

(1) Rewrite 

      subroutine sub(...)
chpf$ assume
CASE 1
chpf$ or
CASE 2
chpf$ end assume
      ...
      end sub

As (this is a cloning)

      subroutine sub_1(...)
      CASE 1 ...
      subroutine sub_2(...)
      CASE 2 ...

Compile the subroutines. When such a subroutine is called, insert the call
to the right version (which is simply derived under constraint D1: it is
sub_"minimum occurrence number compatible with the arguments").

(2) Other possible implementation, without constraint D1, but requiring
constraint D4(a): the routine is rewritten as

       subroutine sub_"name_from_case(CASE X)"(...)
       CASE X...

name_from_case should depend only on the descriptive mapping of
arguments. This is how (C++) templates can be compiled in C++, as far as I
remmeber. 

(3) Other possible implementation, without D1 and D4(a), the switching must be
performed at runtime, between the cloned versions, thus:

       subroutine sub
       if CASE X call sub_x ...
       else if CASE Y call sub_y ...


Example:
--------

The computation and distributions in this example do not make much sense.
Note the align directive outside the assume/end assume. 

      sub callee(a, c)
      parameter(n=100)
      real a(n,n), c ! arguments
      real b(n,n) ! local array
chpf$ align b with a
chpf$ assume 
chpf$ distribute a(block,*)      
chpf$ or
chpf$ distribute a(block,block)
chpf$ end assume 
chpf$ independent(i,j)
      forall(i=1:n,j=1:n) b(i,j) = c*sqrt(i*i+j*j)
chpf$ independent(i,j)
      forall(i=1:n,j=1:n) a(i,j)=a(i,j)/b(i,j)
      end callee

      sub caller()
      parameter(n=100)
      real x(n,n),y(n,n)
chpf$ distribute x(block,*)
chpf$ distribute y(block,block)
      ...
      call callee(x, 0.1)
      call callee(y, 0.25)
      ...
      end caller
---------------------------------------------------------------------------
To (un)subscribe to this list, send mail to
hpff-distribute-request@cs.rice.edu.
Leave the subject line blank, and in the body put the line
(un)subscribe <email-address>
---------------------------------------------------------------------------

From owner-hpff-distribute  Tue Jan 23 04:23:10 1996
Received: (from daemon@localhost) by cs.rice.edu (8.7.1/8.7.1) id EAA20871 for hpff-distribute-out; Tue, 23 Jan 1996 04:23:10 -0600 (CST)
Received: from fontainebleau.ensmp.fr (root@fontainebleau.ensmp.fr [192.54.148.100]) by cs.rice.edu (8.7.1/8.7.1) with SMTP id EAA20866 for <hpff-distribute@cs.rice.edu>; Tue, 23 Jan 1996 04:22:51 -0600 (CST)
Received: from cri.ensmp.fr (chailly.ensmp.fr) by fontainebleau.ensmp.fr with SMTP id AA29682
  (5.67a8/IDA-1.5 for <hpff-distribute@cs.rice.edu>); Tue, 23 Jan 1996 11:22:22 +0100
Received: from episy.caii by cri.ensmp.fr (4.1/SMI-4.0)
	id AA18337; Tue, 23 Jan 96 11:22:22 +0100
Date: Tue, 23 Jan 96 11:22:22 +0100
Message-Id: <9601231022.AA18337@cri.ensmp.fr>
Received: by episy.caii (4.1/SMI-4.1)
	id AA17955; Tue, 23 Jan 96 11:22:05 +0100
From: Fabien COELHO <coelho@chailly.ensmp.fr>
To: hpff-distribute@cs.rice.edu
Subject: hpff-distribute: ASSUME directive proposal - erratum
Cc: coelho@chailly.ensmp.fr
Sender: owner-hpff-distribute
Precedence: bulk

---------------------------------------------------------------------------
hpff-distribute@cs.rice.edu is a mailing list for discussion of data
distribution in High Performance Fortran.  Instructions for adding or
deleting yourself from this list appear at the bottom of this message.
---------------------------------------------------------------------------

> (2) the declaration is not important AND distinct descriptive mappings
>     => possible naming convention for compile/link-time handling
>        a` la C++, but disallow interesting use of the feature (D5/D6)...
> 
> (2) Other possible implementation, without constraint D1, but requiring
> constraint D4(a): the routine is rewritten as
> 
>        subroutine sub_"name_from_case(CASE X)"(...)
>        CASE X...
> 
> name_from_case should depend only on the descriptive mapping of
> arguments. This is how (C++) templates can be compiled in C++, as far as I
> remmeber. 

Well, I'm wrong. The analogy is with the management of C++ polymorphism
by simple linkers. The problem with C++ templates is to compile only once
the routines, and some compilers keep a database of already compiled
template instances to avoid several compilations. The polymorphism problem
is to differentiate int my_function(int) and int my_function(float), if
the linker does only want to know about the function name and not its
type. The suggested solution is to add some suffix which depends on
the function type, generating my_function_$#%$@ and my_function_43%$21 
so that the linker will be happy with different function names.

However I think that such techniques should not be necessary for an HPF
assume-like directive if care is taken in the definition of the
directive. 

Fabien.

--
Fabien COELHO __ http://www.cri.ensmp.fr/~coelho __ coelho@cri.ensmp.fr
  CRI, ENSMP, 35, rue Saint Honoré, 77305 Fontainebleau Cedex, France
     phone: 33 1 64 69 {voice: 48 52, fax: 47 09, standard: 47 08}
       ________  All opinions expressed here are mine  ________


---------------------------------------------------------------------------
To (un)subscribe to this list, send mail to
hpff-distribute-request@cs.rice.edu.
Leave the subject line blank, and in the body put the line
(un)subscribe <email-address>
---------------------------------------------------------------------------

