      SUBROUTINE SMOOTH( X, Y, N, ICOL, ISYM, ISIZE, INUM, LINTYP )
      LOGICAL START_NEW, DRAW_LINE, DRAW_MARK, INSIDE, INX0, INX
      LOGICAL VALID
      DIMENSION X(N), Y(N)
      COMMON /HSCALE/ XSLOPE, XCONST, YSLOPE, YCONST
      COMMON /WORLD/ XMIN, XMAX, YMIN, YMAX
      COMMON /CHKBON/ INSIDE, START_NEW, LINNYP, LIN1, DASH
      DATA DYX / .5 /
C
      VALID = N .GE. 3
      IF ( VALID )
         H0 = X(2) - X(1)
         DO ( I = 3, N )
            H1 = X(I) - X(I-1)
            VALID = VALID .AND. ( H0 * H1 .GT. 0 )
            FIN
         FIN
      WHEN ( VALID )
         DRAW_LINE = INUM .GE. 0
         DRAW_MARK = ISIZE .GE. 1 .AND. ISIZE .LE. 5
         DRAW_MARK = DRAW_MARK .AND. ISYM .GE. 0 .AND. ISYM .LE. 5
         DRAW_MARK = DRAW_MARK .AND. INUM .NE. 0 
         IF ( DRAW_LINE )
            START_NEW = .TRUE.
            CALL COLTYP(ICOL)
            OPEN( UNIT=1, TYPE='SCRATCH' )
            DO ( I = 1, N ) WRITE(1,*) X(I), Y(I)
            REWIND 1
C
            H0 = X(2) - X(1)
            Y0 = 6 * ( Y(2) - Y(1) ) / H0
            FAC = 0.
            DO ( I = 2, N-1 )
               H1 = X(I+1) - X(I)
               X(I) = ( 2 * ( H1 + H0 ) - FAC ) / H1
               Y1 = 6 * ( Y(I+1) - Y(I) ) / H1
               Y(I) = ( Y1 - Y0 - Y(I-1) * FAC ) / H1
               Y0 = Y1
               H0 = H1
               FAC = H0 / X(I)
               FIN
            Y(1) = 0.
            Y(N) = 0.
            DO ( I = N-1, 2, -1 ) Y(I) = ( Y(I) - Y(I+1) ) / X(I)
C
            C0 = Y(1)
            READ(1,*) X(1), Y(1)
            CALL MOVETO( X(1), Y(1), 0, LINTYP )
            INX0 = ( X(1) - XMIN ) * ( XMAX - X(1) ) .GE. 0.
            DO ( I = 2, N )
               C1 = Y(I)
               READ(1,*) X(I), Y(I)
               INX = ( X(I) - XMIN ) * ( XMAX - X(I) ) .GE. 0.
               H = X(I) - X(I-1)
               B = Y(I) / H - C1 * H / 6.
               D = Y(I-1) / H - C0 * H / 6.
               SQR = SQRT( ( C0 * C0 + C1 * C1 + C0 * C1 ) * 3. )
               ANUM = C1 + 2 * C0
               ADEN = 3 * C0 + SQR
               DY = 0.
               DC = C1 - C0
               IF( ANUM*ADEN .GT. 0. .AND. ANUM*ADEN .LT. ADEN*ADEN )
                  DX = ANUM / ADEN
                  DY = ABS( DX * (( DC * DX + 3 * C0 ) * DX - ANUM ) )
                  FIN
               ADEN = 3 * C0 - SQR
               IF( ANUM*ADEN .GT. 0. .AND. ANUM*ADEN .LT. ADEN*ADEN )
                  DX = ANUM / ADEN
                  DY1 = ABS( DX * (( DC * DX + 3 * C0 ) * DX - ANUM ) )
                  DY = AMAX1( DY, DY1 )
                  FIN
               DY = ABS( YSLOPE * H * H * DY / 6. )
               IF ( DY .GE. DYX .AND. ( INX0 .OR. INX ) )
                  NN = DY / DYX + 1
                  DO ( J = 1, NN - 1 )
                     XI0 = ( H * J ) / NN 
                     XI = XI0 + X(I-1)
                     XI1 = H - XI0
                     YI = XI0 * ( C1 * XI0 * XI0 / ( 6 * H ) + B )
                     YI = YI + XI1 * ( C0 * XI1 * XI1 / ( 6 * H ) + D )
                     CALL MOVETO( XI, YI, 1, LINTYP )
                     FIN
                  FIN
               INX0 = INX
               C0 = C1
               CALL MOVETO( X(I), Y(I), 1, LINTYP )
               FIN
            CLOSE ( UNIT=1 )
            FIN
         IF ( DRAW_MARK )
            START_NEW = .TRUE.
            ITEMP = IABS(INUM)
            CALL COLTYP(ICOL)
            DO ( I = 1, N, ITEMP )
               CALL MOVETO( X(I), Y(I), 0, LINTYP )
               IF ( INSIDE ) CALL MARKER( ISYM, ISIZE )
               FIN
            FIN
         FIN
      ELSE
         CALL DASHLN( X, Y, N, ICOL, ISYM, ISIZE, INUM, LINTYP )
         FIN
C
      RETURN
      END
