home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #31 / NN_1992_31.iso / spool / gnu / g / bug / 2097 < prev    next >
Encoding:
Text File  |  1992-12-30  |  16.3 KB  |  550 lines

  1. Newsgroups: gnu.g++.bug
  2. Path: sparky!uunet!cis.ohio-state.edu!cse.ucsc.EDU!conrad
  3. From: conrad@cse.ucsc.EDU (Al Conrad)
  4. Subject: g++ error
  5. Message-ID: <199212291938.AA16689@arapaho.ucsc.edu>
  6. Sender: gnulists@ai.mit.edu
  7. Organization: GNUs Not Usenet
  8. Distribution: gnu
  9. Date: Tue, 29 Dec 1992 03:38:52 GMT
  10. Approved: bug-g++@prep.ai.mit.edu
  11. Lines: 537
  12.  
  13. Please find below a shar file.  If you unpack the files and type:
  14.  
  15.              g++ -c symplnf.c
  16.  
  17. you will (hopefully) get the error.
  18.  
  19.    /usr/local/gnu/bin/gcc: Internal compiler error: program cc1plus got
  20.    fatal signal 6
  21.  
  22. When I compile this in my normal build environment I get the error:
  23.  
  24.     symplnf.c: In function `void  symplnf (class polynomial::matrix&, class
  25.     polynomial::matrix&, class polynomial::matrix&, class coefficient::
  26.     polynomial*, int, int)':
  27.  
  28.     symplnf.c:62: Internal compiler error.
  29.     symplnf.c:62: Please report this to `bug-g++@prep.ai.mit.edu'.
  30.     *** Error code 1
  31.     make: Fatal error: Command failed for target `symplnf.o'
  32.  
  33. So I am sending you this mail as per that message.
  34.  
  35. Good luck,
  36.  
  37. Al Conrad
  38.  
  39. --------------------------------------------------------------------------
  40. #! /bin/sh
  41. # This is a shell archive.  Remove anything before this line, then unpack
  42. # it by saving it into a file and typing "sh file".  To overwrite existing
  43. # files, type "sh file -c".  You can also feed this as standard input via
  44. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  45. # will see the following message at the end:
  46. #        "End of shell archive."
  47. # Contents:  axl.h eval.h gbug.shar mat.h poly.h rational.h symplnf.c
  48. #   vec.h
  49. # Wrapped by conrad@arapaho on Tue Dec 29 11:21:32 1992
  50. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  51. if test -f 'axl.h' -a "${1}" != "-c" ; then 
  52.   echo shar: Will not clobber existing file \"'axl.h'\"
  53. else
  54. echo shar: Extracting \"'axl.h'\" \(2357 characters\)
  55. sed "s/^X//" >'axl.h' <<'END_OF_FILE'
  56. X//
  57. X//    Class definition for axl
  58. X//    (algebraic extension of an underlying field)
  59. X//
  60. X
  61. X#include <stream.h>
  62. X#include <Rational.h>
  63. X
  64. Xclass axl2 {
  65. Xpublic:
  66. X            axl2() {}
  67. X
  68. X    virtual    int    is_rational()
  69. X        { cerr << __LINE__ << "," << __FILE__ << " ouch\n"; return 0; }
  70. X    virtual    Integer    get_numerator()
  71. X        { cerr << __LINE__ << "," << __FILE__ << " ouch\n"; return 0; }
  72. X    virtual    Integer    get_denominator()
  73. X        { cerr << __LINE__ << "," << __FILE__ << " ouch\n"; return 0; }
  74. X    virtual void    get_irrational( int&, axl2**&, int&, axl2**& )
  75. X        { cerr << __LINE__ << "," << __FILE__ << " ouch\n";           }
  76. X    virtual char*    form();
  77. X        int    depth();
  78. X
  79. Xfriend        axl2*    add( axl2*, axl2* );
  80. Xfriend        axl2*    mul( axl2*, axl2* );
  81. Xfriend        axl2*    div( axl2*, axl2* );
  82. Xfriend        int    equal( axl2*, axl2* );
  83. X};
  84. X
  85. Xclass axl {
  86. Xfriend class axl2;
  87. Xfriend class rational;
  88. Xfriend class irrational;
  89. X    axl2* v;
  90. Xpublic:
  91. X            axl();
  92. X            axl( int );
  93. X            axl( int, int );
  94. X            axl( axl2* );
  95. X        int    is_rational()    { return v->is_rational();       }
  96. X        Integer    get_numerator()    { return v->get_numerator();     }
  97. X        Integer    get_denominator(){return v->get_denominator();   }
  98. X        void    get_irrational(int& cd, axl2**& cc, int& md ,axl2**& mc)
  99. X              { v->get_irrational( cd, cc, md, mc ); }
  100. X        char*    form()        { return v->form();         }
  101. X        double eval();
  102. X    axl    operator =( axl  );
  103. X    axl    operator =( axl2 );
  104. X    axl    operator+=( axl  );
  105. X    axl    operator-=( axl );
  106. X    axl    operator*=( axl );
  107. X    axl    operator/=( axl );
  108. X    axl    operator- ();
  109. X    axl2*    getvalue();
  110. X
  111. Xfriend    ostream&    operator<<( ostream&, axl );
  112. Xfriend    axl        root( axl );
  113. Xfriend    axl        operator+ ( axl, axl );
  114. Xfriend    axl        operator- ( axl, axl );
  115. Xfriend    axl        operator* ( axl, axl );
  116. Xfriend    axl        operator/ ( axl, axl );
  117. Xfriend    int        operator==( axl, axl );
  118. Xfriend    int        operator>=( axl, axl );
  119. Xfriend    int        operator<=( axl, axl );
  120. Xfriend    int        operator> ( axl, axl );
  121. Xfriend    int        operator< ( axl, axl );
  122. Xfriend    int        operator!=( axl, axl );
  123. X};
  124. X
  125. Xclass irrational : public axl2 {
  126. X    int    coset_rep_degree;
  127. X    axl2**    coset_rep_coefficients;
  128. X    int    min_poly_degree;
  129. X    axl2**    min_poly_coefficients;
  130. Xpublic:
  131. X    irrational()    {}
  132. X    irrational( int, axl2**, int, axl2** );
  133. X    int    is_rational()        { return 0; }
  134. X    void    get_irrational( int&, axl2**&, int&, axl2**& );
  135. X
  136. Xfriend    axl        root( axl );
  137. X};
  138. Xinline axl operator/( int a, axl b )
  139. X            { return (*(new axl(a))) / b ; }
  140. Xinline axl operator*( int a, axl b )
  141. X            { return (*(new axl(a))) * b ; }
  142. END_OF_FILE
  143. if test 2357 -ne `wc -c <'axl.h'`; then
  144.     echo shar: \"'axl.h'\" unpacked with wrong size!
  145. fi
  146. # end of 'axl.h'
  147. fi
  148. if test -f 'eval.h' -a "${1}" != "-c" ; then 
  149.   echo shar: Will not clobber existing file \"'eval.h'\"
  150. else
  151. echo shar: Extracting \"'eval.h'\" \(123 characters\)
  152. sed "s/^X//" >'eval.h' <<'END_OF_FILE'
  153. X//
  154. X//  header file for function to evaluate an axl by an approximated Complex.
  155. X//
  156. X#include <Complex.h>
  157. X
  158. XComplex
  159. Xeval(axl);
  160. END_OF_FILE
  161. if test 123 -ne `wc -c <'eval.h'`; then
  162.     echo shar: \"'eval.h'\" unpacked with wrong size!
  163. fi
  164. # end of 'eval.h'
  165. fi
  166. if test -f 'gbug.shar' -a "${1}" != "-c" ; then 
  167.   echo shar: Will not clobber existing file \"'gbug.shar'\"
  168. else
  169. echo shar: Extracting \"'gbug.shar'\" \(0 characters\)
  170. sed "s/^X//" >'gbug.shar' <<'END_OF_FILE'
  171. END_OF_FILE
  172. if test 0 -ne `wc -c <'gbug.shar'`; then
  173.     echo shar: \"'gbug.shar'\" unpacked with wrong size!
  174. fi
  175. # end of 'gbug.shar'
  176. fi
  177. if test -f 'mat.h' -a "${1}" != "-c" ; then 
  178.   echo shar: Will not clobber existing file \"'mat.h'\"
  179. else
  180. echo shar: Extracting \"'mat.h'\" \(2529 characters\)
  181. sed "s/^X//" >'mat.h' <<'END_OF_FILE'
  182. X//
  183. X// Matrix utilities header file.
  184. X//
  185. X// ARC  10/11/88
  186. X//
  187. X
  188. X#include <stream.h>
  189. X
  190. Xclass matrix {
  191. X    int width;
  192. X    axl **data;
  193. Xpublic:
  194. X    matrix( int w );
  195. X    matrix( int w, axl* );
  196. X    matrix( vector* );
  197. X
  198. X    axl * &operator[](int i) { return data[i]; }
  199. X    void  put( int, int, axl );
  200. X    axl  get( int, int );
  201. X    void J();
  202. X    void zero();            // replace with = 0 someday.
  203. X    void id();            // replace with = 1 someday.
  204. X    int  nilpotent( int& );
  205. X    void swap_rows( int, int );
  206. X    matrix& pow( int );
  207. X    matrix& eval( polynomial& );
  208. X    matrix& transpose();
  209. X    matrix& operator=( matrix& );
  210. X    matrix& operator-();
  211. X    matrix& operator+=( matrix& );
  212. X    matrix& operator-=( matrix& );
  213. X    matrix& operator*=( matrix& );
  214. X    matrix& operator*=( axl );
  215. X    matrix& operator/=( axl );
  216. X    void print( ostream& );
  217. X    void read();
  218. X    int  symplectic();
  219. X
  220. Xfriend  matrix& operator* (   axl, matrix&  );
  221. Xfriend  matrix& operator/ ( matrix&, axl    );
  222. Xfriend    matrix& operator* ( matrix&, matrix& );
  223. Xfriend    matrix& operator+ ( matrix&, matrix& );
  224. Xfriend    matrix& operator- ( matrix&, matrix& );
  225. Xfriend  int     operator==( matrix&, axl    );
  226. X
  227. Xfriend    void    sigmaN( matrix&, matrix&, matrix&, polynomial&, int );
  228. Xfriend    matrix&    sigmaNsum( matrix&, polynomial&, int );
  229. Xfriend    matrix&    sigmaNterm( matrix&, polynomial&, int );
  230. X
  231. Xfriend    void    symplnf( matrix&, matrix&, matrix&, polynomial[], int, int );
  232. X/*
  233. Xfriend  matrix& exp( matrix& );
  234. Xfriend  vector& operator*( matrix&, vector& );
  235. Xfriend  vector& operator/( vector&, matrix& );
  236. Xfriend  matrix& operator/( matrix&, matrix& );
  237. Xfriend  void    forward_eliminate(   matrix&, vector&, vector& );
  238. Xfriend  void    backward_substitute( matrix&, vector&, vector& );
  239. Xfriend  void    solve_for_vector( matrix&, matrix&, matrix&, vector&, vector& );
  240. Xfriend  void    lu( matrix&, matrix&, matrix&, matrix& );
  241. Xfriend  void    frugal_lu( matrix&, matrix&, vector& );
  242. Xfriend  int     max_in_column( int, matrix& );
  243. Xfriend  double  max_entry( matrix& );
  244. Xfriend  void    swap_rows( int, matrix&, int );
  245. Xfriend  void    swap_sub_rows( int, matrix&, int );
  246. Xfriend  void    copy_spike( int, matrix&, matrix& );
  247. Xfriend  void    extract_sub_row( int, vector&, matrix& );
  248. Xfriend  void    extract_column( vector&, matrix&, int );
  249. Xfriend  void    insert_column( vector&, matrix&, int );
  250. Xfriend    int    scale_factor( matrix& );
  251. Xfriend    int    floorlog2( double );
  252. Xfriend    double    maxentry( matrix& );
  253. X*/
  254. X};
  255. X    int    fact( int );
  256. X    int    choose( int, int );
  257. Xinline    int        operator==( matrix& a, int n )
  258. X                { return a == axl(n); }
  259. Xinline    int        operator!=( matrix& a, int n )
  260. X                { return ! ( a == axl(n) ); }
  261. END_OF_FILE
  262. if test 2529 -ne `wc -c <'mat.h'`; then
  263.     echo shar: \"'mat.h'\" unpacked with wrong size!
  264. fi
  265. # end of 'mat.h'
  266. fi
  267. if test -f 'poly.h' -a "${1}" != "-c" ; then 
  268.   echo shar: Will not clobber existing file \"'poly.h'\"
  269. else
  270. echo shar: Extracting \"'poly.h'\" \(1785 characters\)
  271. sed "s/^X//" >'poly.h' <<'END_OF_FILE'
  272. X//
  273. X// polynomial class header file
  274. X//
  275. X// Maintains coefficients as a doubly linked list.
  276. X// leading_coefficient is the head and constant_term is the tail.
  277. X//
  278. X// ARC  5/31/89
  279. X//
  280. X
  281. X#include <stream.h>
  282. X
  283. Xclass coefficient {
  284. Xfriend class polynomial;
  285. X    axl value;
  286. X    coefficient *next;
  287. X    coefficient *prev;
  288. Xpublic:
  289. X    coefficient( )                { value = *(new rational(0));
  290. X                          next = prev = NULL; }
  291. X    coefficient( axl v )            { value = v;
  292. X                          next = prev = NULL; }
  293. Xfriend    polynomial&    operator+( polynomial&, polynomial& );
  294. Xfriend    polynomial&    operator-( polynomial&, polynomial& );
  295. Xfriend    polynomial&    operator/( polynomial&, rational&   );
  296. X};
  297. X
  298. Xclass polynomial {
  299. Xfriend class matrix;
  300. X    coefficient *leading_coefficient;
  301. X    coefficient *constant_term;
  302. Xpublic:
  303. X    polynomial();
  304. X    polynomial( int );
  305. X    polynomial( int, axl* );
  306. X                
  307. X    void        head_add( coefficient* );
  308. X    void        tail_add( coefficient* );
  309. X    void        head_pop();
  310. X    int         degree();
  311. X    void        clear_leading_zeros();
  312. X    axl        coefficient_of_term( int );
  313. X    void        reset( axl * );
  314. X    void        get_coefficients( axl ** );
  315. X    polynomial&    operator=( polynomial& );
  316. X    polynomial&    operator=( int n )
  317. X                { return *this = *(new polynomial(n) ); };
  318. X    polynomial&    operator+=( polynomial& );
  319. X    polynomial&    operator-=( polynomial& );
  320. X
  321. Xfriend    polynomial&    operator* ( polynomial&, polynomial& );
  322. Xfriend    polynomial&    operator/ ( polynomial&, polynomial& );
  323. Xfriend    polynomial&    operator/ ( polynomial&, rational&   );
  324. Xfriend    polynomial&    operator% ( polynomial&, polynomial& );
  325. Xfriend    polynomial&    operator+ ( polynomial&, polynomial& );
  326. Xfriend    polynomial&    operator- ( polynomial&, polynomial& );
  327. Xfriend    int        operator==( polynomial&, polynomial& );
  328. Xfriend    ostream&    operator<<( ostream&, polynomial& );
  329. Xfriend    void    divide_polys( polynomial&, polynomial&, polynomial&, polynomial&);
  330. X};
  331. END_OF_FILE
  332. if test 1785 -ne `wc -c <'poly.h'`; then
  333.     echo shar: \"'poly.h'\" unpacked with wrong size!
  334. fi
  335. # end of 'poly.h'
  336. fi
  337. if test -f 'rational.h' -a "${1}" != "-c" ; then 
  338.   echo shar: Will not clobber existing file \"'rational.h'\"
  339. else
  340. echo shar: Extracting \"'rational.h'\" \(2153 characters\)
  341. sed "s/^X//" >'rational.h' <<'END_OF_FILE'
  342. X//
  343. X//    Class definition for rationals.
  344. X//
  345. X//    ARC   10/24/90
  346. X//
  347. X
  348. X#include <stream.h>
  349. X
  350. Xclass rational : public axl2 {
  351. X    Rational r;
  352. Xpublic:
  353. X        rational()    { r = *(new Rational(0)); }
  354. X        rational(int n) { r = *(new Rational((long)n)); }
  355. X        rational(long n) { r = *(new Rational(n)); }
  356. X        rational(rational& rr) { r = *(new Rational(rr.r)); }
  357. X        rational(int n, int d) { r = *(new Rational((long)n,(long)d));}
  358. X        rational(Integer n, Integer d) { r = *(new Rational(n,d)); }
  359. X    int        is_rational()        { return 1; };
  360. X    Integer    get_numerator()        { return r.numerator(); };
  361. X    Integer    get_denominator()    { return r.denominator(); };
  362. X    axl&    promote() { axl* a = new axl;
  363. X                a->v = new rational( *this );
  364. X                return *a; }
  365. X    rational    operator =( rational );
  366. X    rational    operator =( int     n ) { r = Rational(n); return *this; };
  367. X    rational    operator+=( rational );
  368. X    rational    operator-=( rational );
  369. X    rational    operator*=( rational );
  370. X    rational    operator/=( rational );
  371. X    rational    operator- ();
  372. X    char*    rform();
  373. X    int        perfect_square( rational* );
  374. X
  375. Xfriend    rational    operator+ ( rational, rational );
  376. Xfriend    rational    operator- ( rational, rational );
  377. Xfriend    rational    operator* ( rational, rational );
  378. Xfriend    rational    operator/ ( rational, rational );
  379. Xfriend    int        operator==( rational, rational );
  380. Xfriend    int        operator!=( rational, rational );
  381. Xfriend    int        operator< ( rational, rational );
  382. Xfriend    int        operator> ( rational, rational );
  383. Xfriend    int        operator<=( rational, rational );
  384. Xfriend    int        operator>=( rational, rational );
  385. X};
  386. X
  387. Xint lcm( int, int );
  388. Xint gcd( int, int );
  389. Xint perfect_square( int& );
  390. XInteger greatest_square_divisor( Integer );
  391. X
  392. Xinline    int        operator==( rational a, int n )
  393. X                { return a == *(new rational(n)); }
  394. Xinline    int        operator!=( rational a, int n )
  395. X                { return a != *(new rational(n)); }
  396. Xinline    int        operator> ( rational a, int n )
  397. X                { return a >  *(new rational(n)); }
  398. Xinline    int        operator< ( rational a, int n )
  399. X                { return a <  *(new rational(n)); }
  400. Xinline    int        operator>=( rational a, int n )
  401. X                { return a >= *(new rational(n)); }
  402. Xinline    int        operator<=( rational a, int n )
  403. X                { return a <= *(new rational(n)); }
  404. END_OF_FILE
  405. if test 2153 -ne `wc -c <'rational.h'`; then
  406.     echo shar: \"'rational.h'\" unpacked with wrong size!
  407. fi
  408. # end of 'rational.h'
  409. fi
  410. if test -f 'symplnf.c' -a "${1}" != "-c" ; then 
  411.   echo shar: Will not clobber existing file \"'symplnf.c'\"
  412. else
  413. echo shar: Extracting \"'symplnf.c'\" \(2387 characters\)
  414. sed "s/^X//" >'symplnf.c' <<'END_OF_FILE'
  415. X//
  416. X// Functions for computing the normal form of a matrix
  417. X// as given in Burgoyne/Cushman 1972.  B is the normal form
  418. X// and P is the change of basis matrix.
  419. X// The array of polynomials, p, contains terms of the
  420. X// minimal polynomial of the form p[i] = (x^2 + alpha_i^2).  m is the
  421. X// number of polynomials in the array (i.e., the degree of the minimal
  422. X// polynomial is 2m).  If m=1, or if m=2 and alpha_1 = alpha_2, then we
  423. X// follow the bc72 algorithm as described on page 436 (example on page
  424. X// 440).  Otherwise (m=2 and alpha_1 != alpha_2) we follow the bc72
  425. X// algorithm as described on page 439 (example on page 441).
  426. X//
  427. X// ARC  5/31/89
  428. X//
  429. X
  430. X#include <libc.h>
  431. X#include <assert.h>
  432. X
  433. X#include "axl.h"
  434. X#include "rational.h"
  435. X#include "poly.h"
  436. X#include "vec.h"
  437. X#include "mat.h"
  438. X
  439. Xvoid symplnf( matrix &A, matrix& B, matrix& P, polynomial p[], int m, int n )
  440. X{
  441. X    matrix S(A.width), N(A.width);
  442. X
  443. X    if ( n != 2 ) {
  444. X        cout << "symplnf: char poly must be degree 4\n";
  445. X        exit( -1 );
  446. X    }
  447. X
  448. X    if ( m == 1 || ( m == 2 && p[0].coefficient_of_term(0) ==
  449. X                               p[1].coefficient_of_term(0) ) ) {
  450. X/*
  451. X    if ( m == 1 || ( m == 2 && p[0] == p[1] ) ) {
  452. X*/
  453. X    // first decompose into semi-simple and nilpotent parts
  454. X    sigmaN( A, S, N, p[0], m );
  455. X
  456. X    // for now we require that N^2 = 0
  457. X    if ( N * N != 0 ) {
  458. X        cout << "symplnf: Sorry, only implemented for N*N = 0\n";
  459. X        exit(1);
  460. X    }
  461. X
  462. X    // in this case normal form is as in 11/25/90 notes.
  463. X    axl alpha;
  464. X    alpha = root( p[0].coefficient_of_term(0) );
  465. X    B[1][0] = B[3][2] =  alpha;
  466. X    B[0][1] = B[2][3] = -alpha;
  467. X    B[2][0] = B[3][1] = -1;
  468. X
  469. X    // change of basis matrix is as on bc72 p. 441.
  470. X    axl sigma, gamma;
  471. X    sigma = root( -1/N[2][0] );    // see 1/24/91 notes
  472. X    gamma = root(   -N[2][0] );    // see 1/24/91 notes
  473. X
  474. X    matrix J(4);
  475. X    J.J();
  476. X    axl z0_values[] = { sigma, 0, 0, 0 };
  477. X    vector z0( 4, z0_values );
  478. X
  479. X    vector b1( 4 );
  480. X    vector b2( 4 );
  481. X    vector b3( 4 );
  482. X    vector b4( 4 );
  483. X
  484. X    b1 = z0 - ( 1 / ( 2 * alpha * alpha ) ) * ( z0 * ( J * (S * z0 ) ) )
  485. X         * ( N * ( S * z0 ) );
  486. X    b2 = ( 1 / alpha ) * ( S * b1 );
  487. X    b3 = -N * b1;
  488. X    b4 = -( 1 / alpha ) * ( S * N ) *  b1;
  489. X
  490. X    vector columns[] = { b1, b2, b3, b4 };
  491. X    matrix PP( columns );
  492. X    P = PP.transpose();
  493. X    }
  494. X    else if ( m == 2 ) {
  495. X        cout << "Code for non-repeating eigenvalues is TBD.\n";
  496. X        exit(-1);
  497. X    }
  498. X    else {
  499. X        cout << "Bad m value.\n";
  500. X        exit(-1);
  501. X    }
  502. X}
  503. END_OF_FILE
  504. if test 2387 -ne `wc -c <'symplnf.c'`; then
  505.     echo shar: \"'symplnf.c'\" unpacked with wrong size!
  506. fi
  507. # end of 'symplnf.c'
  508. fi
  509. if test -f 'vec.h' -a "${1}" != "-c" ; then 
  510.   echo shar: Will not clobber existing file \"'vec.h'\"
  511. else
  512. echo shar: Extracting \"'vec.h'\" \(493 characters\)
  513. sed "s/^X//" >'vec.h' <<'END_OF_FILE'
  514. X//
  515. X// vector utilities header file.
  516. X//
  517. X// ARC  10/11/88
  518. X//
  519. X
  520. X#include <stream.h>
  521. X
  522. Xclass vector {
  523. Xfriend matrix;
  524. X    int width;
  525. X    axl *data;
  526. Xpublic:
  527. X    vector( int w );
  528. X    vector( int w, axl* );
  529. X
  530. X    axl operator[](int i) {return data[i]; };
  531. X    char* form();
  532. X
  533. X    vector operator= ( vector );
  534. X
  535. Xfriend axl operator*( vector, vector );
  536. Xfriend vector operator-( vector, vector );
  537. Xfriend vector operator*( axl, vector );
  538. Xfriend vector operator*( matrix, vector );
  539. Xfriend    ostream&    operator<<( ostream&, vector );
  540. X};
  541. END_OF_FILE
  542. if test 493 -ne `wc -c <'vec.h'`; then
  543.     echo shar: \"'vec.h'\" unpacked with wrong size!
  544. fi
  545. # end of 'vec.h'
  546. fi
  547. echo shar: End of shell archive.
  548. exit 0
  549.  
  550.