home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / eispack-1.0-src.tgz / tar.out / contrib / eispack / ex / rteispak.f < prev    next >
Text File  |  1996-09-28  |  13KB  |  272 lines

  1. c
  2. c     this driver tests  eispack  for the class of real tri-
  3. c     diagonal matrices exhibiting the use of  eispack  to find all the
  4. c     eigenvalues and eigenvectors, only all the eigenvalues, some of
  5. c     the eigenvalues and the corresponding eigenvectors, or only some
  6. c     of the eigenvalues.
  7. c
  8. c     this driver is catalogued as  eispdrv4(rteispak).
  9. c
  10. c     the dimension of  a  should be  nm  by  3.
  11. c     the dimension of  z  should be  nm  by  nm.
  12. c     the dimension of  w,norm,d,e,e2,rv1,rv2,rv3,rv4,rv5,rv6,  and
  13. c     ind  should be  nm.
  14. c     here nm = 20.
  15. c
  16.       double precision z( 20, 20),a( 20, 3),w( 20),d( 20),e( 20),
  17.      x        e2( 20),rv1( 20),rv2( 20),rv3( 20),rv4( 20),rv5( 20),
  18.      x        rv6( 20),norm( 20),tcrit,machep,resdul,maxeig,maxdif,
  19.      x        eigdif,u,lb,ub,eps1
  20.       integer  ind( 20),error
  21.       data ireadc/5/,iwrite/6/
  22. c
  23. c     .......... machep is a machine dependent parameter specifying
  24. c                the relative precision of floating point arithmetic.
  25. c
  26.       machep = 1.0d0
  27.     1 machep = 0.5d0*machep
  28.       if (1.0d0 + machep .gt. 1.0d0 ) go to 1
  29.       machep = 2.0d0*machep
  30. c
  31.       nm = 20
  32.    10 call rmatin(nm,n,a)
  33.       write(iwrite,20) n
  34.    20 format(48h1the subdiagonal, diagonal and superdiagonal in ,
  35.      x   53hthat order of the tridiagonal non-symmetric matrix  a,
  36.      x   10h  of order,i4,4h  is)
  37.       do  30  j = 1,3
  38.          is = max0(1,3-j)
  39.          ie = min0(n,n+2-j)
  40.    30    write(iwrite,40) (a(i,j),i=is,ie)
  41.    40    format(/(1x,1p5d24.16))
  42.       read(ireadc,50) mm,lb,ub,m11,no  
  43.    50 format(i4,2d24.16,2(4x,i4))
  44. c
  45. c     mm,lb,ub,m11,  and  no  are read from sysin after the matrix is
  46. c     generated.  mm,lb,  and  ub  specify to  bisect  the maximum
  47. c     number of eigenvalues and bounds for the interval which is to
  48. c     be searched.  m11  and  no  specify to  tridib  the lower
  49. c     boundary index and the number of desired eigenvalues.
  50. c
  51.       do  230  icall = 1,10
  52. c
  53. c     if  tqlrat  path (label 80) is taken then  tql2  path (label 70)
  54. c     must also be taken in order that the measure of performance be
  55. c     meaningful.
  56. c     if  imtql1  path (label 85) is taken then  imtql2  path (label 75)
  57. c     must also be taken in order that the measure of performance be
  58. c     meaningful.
  59. c
  60.          go to  (70,75,80,85,89,90,95,100,110,115),  icall
  61. c
  62. c     rtwz  using  tql2
  63. c
  64.    70    write(iwrite,71)
  65.    71    format(42h1all of the eigenvalues and corresponding ,
  66.      x     51heigenvectors of the real tridiagonal matrix follow./
  67.      x     36h the path involving  tql2  was used.  )
  68.          call  figi2(nm,n,a,w,e,z,error)
  69.          write(iwrite,72) error
  70.    72    format(//30h *****error from figi2***** = ,i4)
  71.          if( error .ne. 0 )  go to  230
  72.          call  tql2(nm,n,w,e,z,error)
  73.          write(iwrite,725) error
  74.   725    format(//29h *****error from tql2***** = ,i4)
  75.          do 73 i = 1,n
  76.    73       rv6(i) = w(i)
  77.          m = n
  78.          if( error .ne. 0 ) m = error - 1
  79.          go to  130
  80. c
  81. c     rtwz  using  imtql2
  82. c     invoked from driver subroutine  rt.
  83. c
  84.    75    write(iwrite,76)
  85.    76    format(42h1all of the eigenvalues and corresponding ,
  86.      x     51heigenvectors of the real tridiagonal matrix follow./
  87.      x     38h the path involving  imtql2  was used.  )
  88.          call  rt(nm,n,a,w,1,z,e,error)
  89.          write(iwrite,77) error
  90.    77    format(//30h *****error from figi2***** = ,i4)
  91.          if( error .gt. 0 )  go to  230
  92.          write(iwrite,775) error
  93.   775    format(//31h *****error from imtql2***** = ,i4)
  94.          do 78 i = 1,n
  95.             rv5(i) = w(i)
  96.    78    continue
  97.          m = n
  98.          if( error .ne. 0 ) m = error - 1
  99.          go to  130
  100. c
  101. c     rtw  using  tqlrat
  102. c
  103.    80    write(iwrite,805)
  104.   805    format(24h1all of the eigenvalues ,
  105.      x     38hof the real tridiagonal matrix follow./
  106.      x     38h the path involving  tqlrat  was used.  )
  107.          call  figi(nm,n,a,w,e,e2,error)
  108.          write(iwrite,807) error
  109.   807    format(//29h *****error from figi***** = ,i4)
  110.          if( error .gt. 0 )  go to  230
  111.          call  tqlrat(n,w,e2,error)
  112.          write(iwrite,809) error
  113.   809    format(//31h *****error from tqlrat***** = ,i4)
  114.          maxeig = 0.0d0
  115.          maxdif = 0.0d0
  116.          m = n
  117.          if( error .ne. 0 ) m = error - 1
  118.          if( m .eq. 0 ) go to 230
  119.          do 81 i = 1,m
  120.             if( dabs(w(i)) .gt. maxeig ) maxeig = dabs(w(i))
  121.             u = dabs(rv6(i) - w(i))
  122.             if( u .gt. maxdif ) maxdif = u
  123.    81    continue
  124.          if( maxeig .eq. 0.0d0 ) maxeig = 1.0d0
  125.          eigdif = maxdif/(maxeig*machep*dfloat(10*n))
  126.          write(iwrite,82) eigdif
  127.    82    format(//49h comparison of the eigenvalues from  tqlrat  with,
  128.      x          52h those from  tql2  gives the normalized difference  ,
  129.      x          1pd16.8)
  130.          go to  130
  131. c
  132. c     rtw  using  imtql1
  133. c     invoked from driver subroutine  rt.
  134. c
  135.    85    write(iwrite,855)
  136.   855    format(24h1all of the eigenvalues ,
  137.      x     38hof the real tridiagonal matrix follow./
  138.      x     38h the path involving  imtql1  was used.  )
  139.          call  rt(nm,n,a,w,0,z,e,error)
  140.          if( error .gt. 0 )  go to  230
  141.          write(iwrite,859) error
  142.   859    format(//31h *****error from imtql1***** = ,i4)
  143.          maxeig = 0.0d0
  144.          maxdif = 0.0d0
  145.          m = n
  146.          if( error .ne. 0 ) m = error - 1
  147.          if( m .eq. 0 ) go to 230
  148.          do 86 i = 1,m
  149.             if( dabs(w(i)) .gt. maxeig ) maxeig = dabs(w(i))
  150.             u = dabs(rv5(i) - w(i))
  151.             if( u .gt. maxdif ) maxdif = u
  152.    86    continue
  153.          if( maxeig .eq. 0.0d0 ) maxeig = 1.0d0
  154.          eigdif = maxdif/(maxeig*machep*dfloat(10*n))
  155.          write(iwrite,87) eigdif
  156.    87    format(//49h comparison of the eigenvalues from  imtql1  with,
  157.      x          52h those from  imtql2  gives the normalized difference,
  158.      x          1pd16.8)
  159.          go to  130
  160. c
  161. c     rtw1z  ( usage here computes all the eigenvectors )
  162. c
  163.    89    write(iwrite,891)
  164.   891    format(43h1some of the eigenvalues and corresponding ,
  165.      x     51heigenvectors of the real tridiagonal matrix follow./
  166.      x     38h the path involving  imtqlv  was used. )
  167.          call  figi(nm,n,a,d,e,e2,error)
  168.          write(iwrite,892) error
  169.   892    format(//29h *****error from figi***** = ,i4)
  170.          if( error .ne. 0 ) go to 230
  171.          call imtqlv(n,d,e,e2,w,ind,error,rv1)
  172.          write(iwrite,893) error
  173.   893    format(//31h *****error from imtqlv***** = ,i4)
  174.          m = n
  175.          if( error .ne. 0 ) m = error - 1
  176.          call tinvit(nm,n,d,e,e2,m,w,ind,z,error,rv1,rv2,rv3,rv4,rv6)
  177.          write(iwrite,99) error
  178.          call  bakvec(nm,n,a,e,m,z,error)
  179.          write(iwrite,894) error
  180.   894    format(//31h *****error from bakvec***** = , i4)
  181.          go to 130
  182. c
  183. c     rt1w1z  using  tsturm
  184. c
  185.    90    write(iwrite,91)
  186.    91    format(43h1some of the eigenvalues and corresponding ,
  187.      x     51heigenvectors of the real tridiagonal matrix follow./
  188.      x     38h the path involving  tsturm  was used.  )
  189.          eps1 = 0.0d0
  190.          call  figi(nm,n,a,d,e,e2,error)
  191.          write(iwrite,92) error
  192.    92    format(//29h *****error from figi***** = ,i4)
  193.          if( error .ne. 0 )  go to  230
  194.          call  tsturm(nm,n,eps1,d,e,e2,lb,ub,mm,m,w,z,error,rv1,
  195.      x         rv2,rv3,rv4,rv5,rv6)
  196.          if( error .eq. 3*n + 1 ) go to 230
  197.          if( error .gt. 4*n ) m = error - 1
  198.          write(iwrite,93) error
  199.    93    format(//31h *****error from tsturm***** = ,i4)
  200.          call  bakvec(nm,n,a,e,m,z,error)
  201.          write(iwrite,894) error
  202.          go to  150
  203. c
  204. c     rt1w1z  using  bisect  and  tinvit
  205. c
  206.    95    write(iwrite,96)
  207.    96    format(43h1some of the eigenvalues and corresponding ,
  208.      x     51heigenvectors of the real tridiagonal matrix follow./
  209.      x     38h the path involving  bisect  was used.  )
  210.          eps1 = 0.0d0
  211.          call  figi(nm,n,a,d,e,e2,error)
  212.          write(iwrite,97) error
  213.    97    format(//29h *****error from figi***** = ,i4)
  214.          if( error .ne. 0 )  go to  230
  215.          call  bisect(n,eps1,d,e,e2,lb,ub,mm,m,w,ind,error,rv4,rv5)
  216.          write(iwrite,98) error
  217.    98    format(//31h *****error from bisect***** = ,i4)
  218.          if( error .ne. 0 ) go to 230
  219.          call  tinvit(nm,n,d,e,e2,m,w,ind,z,error,rv1,rv2,rv3,rv4,rv6)
  220.          write(iwrite,99) error
  221.    99    format(//31h *****error from tinvit***** = ,i4)
  222.          call  bakvec(nm,n,a,e,m,z,error)
  223.          write(iwrite,894) error
  224.          go to  150
  225. c
  226. c     rt1w  using  bisect
  227. c
  228.   100    write(iwrite,101)
  229.   101    format(25h1some of the eigenvalues ,
  230.      x     38hof the real tridiagonal matrix follow. )
  231.          eps1 = 0.0d0
  232.          call  figi(nm,n,a,d,e,e2,error)
  233.          write(iwrite,102) error
  234.   102    format(//29h *****error from figi***** = ,i4)
  235.          if( error .gt. 0 )  go to  230
  236.          call  bisect(n,eps1,d,e,e2,lb,ub,mm,m,w,ind,error,rv4,rv5)
  237.          write(iwrite,103) error
  238.   103    format(//31h *****error from bisect***** = ,i4)
  239.          go to  150
  240. c
  241. c     rt1w1z  using  tridib  and  tinvit
  242. c
  243.   110    write(iwrite,111)
  244.   111    format(43h1some of the eigenvalues and corresponding ,
  245.      x     51heigenvectors of the real tridiagonal matrix follow./
  246.      x     38h the path involving  tridib  was used. )
  247.          eps1 = 0.0d0
  248.          call  figi(nm,n,a,d,e,e2,error)
  249.          write(iwrite,112) error
  250.   112    format(//29h *****error from figi***** = ,i4)
  251.          if( error .ne. 0 )  go to  230
  252.          call  tridib(n,eps1,d,e,e2,lb,ub,m11,no,w,ind,error,rv4,rv5)
  253.          write(iwrite,113) error
  254.   113    format(//31h *****error from tridib***** = ,i4)
  255.          if( error .ne. 0 )  go to  230
  256.          m = no
  257.          write(iwrite,1135) lb,ub
  258.  1135    format(//49h the eigenvalues as determined by  tridib  are in,
  259.      x          14h the interval ,1pd16.8,5h  to ,d16.8)
  260.          call  tinvit(nm,n,d,e,e2,m,w,ind,z,error,rv1,rv2,rv3,rv4,rv6)
  261.          write(iwrite,114) error
  262.   114    format(//31h *****error from tinvit***** = ,i4)
  263.          call bakvec(nm,n,a,e,m,z,error)
  264.          write(iwrite,894) error
  265.          go to  150
  266. c
  267. c     rt1w  using   tridib
  268. c
  269.   115    write(iwrite,101)
  270.          eps1 = 0.0d0
  271.          call  figi(nm,n,a,d,e,e2,error)
  272.         ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ