/* Dupe.java by Mark D. LaDue */

/* December 18, 1996 */

/*  Copyright (c) 1996 Mark D. LaDue
    You may study, use, modify, and distribute this example for any purpose.
    This example is provided WITHOUT WARRANTY either expressed or implied.  */

/*  This Java application is an example of a self-reproducing program, and
    as such it exhibits prototypical virus-like behavior.  To test it,
    at the command line proceed as follows:

    1. Type "java Dupe.java" to get Dupe.class.
    2. Move Dupe.class to an entirely different directory.
    3. In that different directory type "java Dupe" to run the application.
    4. Inspect the resulting output Dupe.java, which will be exactly the
       same as the original.

    In addition to reproducing itself, the application echoes a wisecrack
    to the standard output.  */

import java.io.*;
class Dupe {
    public static void main (String[] argv) {
int[] src1 = {
47,
42,
32,
68,
117,
112,
101,
46,
106,
97,
118,
97,
32,
98,
121,
32,
77,
97,
114,
107,
32,
68,
46,
32,
76,
97,
68,
117,
101,
32,
42,
47,
10,
10,
47,
42,
32,
68,
101,
99,
101,
109,
98,
101,
114,
32,
49,
56,
44,
32,
49,
57,
57,
54,
32,
42,
47,
10,
10,
47,
42,
32,
32,
67,
111,
112,
121,
114,
105,
103,
104,
116,
32,
40,
99,
41,
32,
49,
57,
57,
54,
32,
77,
97,
114,
107,
32,
68,
46,
32,
76,
97,
68,
117,
101,
10,
32,
32,
32,
32,
89,
111,
117,
32,
109,
97,
121,
32,
115,
116,
117,
100,
121,
44,
32,
117,
115,
101,
44,
32,
109,
111,
100,
105,
102,
121,
44,
32,
97,
110,
100,
32,
100,
105,
115,
116,
114,
105,
98,
117,
116,
101,
32,
116,
104,
105,
115,
32,
101,
120,
97,
109,
112,
108,
101,
32,
102,
111,
114,
32,
97,
110,
121,
32,
112,
117,
114,
112,
111,
115,
101,
46,
10,
32,
32,
32,
32,
84,
104,
105,
115,
32,
101,
120,
97,
109,
112,
108,
101,
32,
105,
115,
32,
112,
114,
111,
118,
105,
100,
101,
100,
32,
87,
73,
84,
72,
79,
85,
84,
32,
87,
65,
82,
82,
65,
78,
84,
89,
32,
101,
105,
116,
104,
101,
114,
32,
101,
120,
112,
114,
101,
115,
115,
101,
100,
32,
111,
114,
32,
105,
109,
112,
108,
105,
101,
100,
46,
32,
32,
42,
47,
10,
10,
47,
42,
32,
32,
84,
104,
105,
115,
32,
74,
97,
118,
97,
32,
97,
112,
112,
108,
105,
99,
97,
116,
105,
111,
110,
32,
105,
115,
32,
97,
110,
32,
101,
120,
97,
109,
112,
108,
101,
32,
111,
102,
32,
97,
32,
115,
101,
108,
102,
45,
114,
101,
112,
114,
111,
100,
117,
99,
105,
110,
103,
32,
112,
114,
111,
103,
114,
97,
109,
44,
32,
97,
110,
100,
10,
32,
32,
32,
32,
97,
115,
32,
115,
117,
99,
104,
32,
105,
116,
32,
101,
120,
104,
105,
98,
105,
116,
115,
32,
112,
114,
111,
116,
111,
116,
121,
112,
105,
99,
97,
108,
32,
118,
105,
114,
117,
115,
45,
108,
105,
107,
101,
32,
98,
101,
104,
97,
118,
105,
111,
114,
46,
32,
32,
84,
111,
32,
116,
101,
115,
116,
32,
105,
116,
44,
10,
32,
32,
32,
32,
97,
116,
32,
116,
104,
101,
32,
99,
111,
109,
109,
97,
110,
100,
32,
108,
105,
110,
101,
32,
112,
114,
111,
99,
101,
101,
100,
32,
97,
115,
32,
102,
111,
108,
108,
111,
119,
115,
58,
10,
10,
32,
32,
32,
32,
49,
46,
32,
84,
121,
112,
101,
32,
34,
106,
97,
118,
97,
32,
68,
117,
112,
101,
46,
106,
97,
118,
97,
34,
32,
116,
111,
32,
103,
101,
116,
32,
68,
117,
112,
101,
46,
99,
108,
97,
115,
115,
46,
10,
32,
32,
32,
32,
50,
46,
32,
77,
111,
118,
101,
32,
68,
117,
112,
101,
46,
99,
108,
97,
115,
115,
32,
116,
111,
32,
97,
110,
32,
101,
110,
116,
105,
114,
101,
108,
121,
32,
100,
105,
102,
102,
101,
114,
101,
110,
116,
32,
100,
105,
114,
101,
99,
116,
111,
114,
121,
46,
10,
32,
32,
32,
32,
51,
46,
32,
73,
110,
32,
116,
104,
97,
116,
32,
100,
105,
102,
102,
101,
114,
101,
110,
116,
32,
100,
105,
114,
101,
99,
116,
111,
114,
121,
32,
116,
121,
112,
101,
32,
34,
106,
97,
118,
97,
32,
68,
117,
112,
101,
34,
32,
116,
111,
32,
114,
117,
110,
32,
116,
104,
101,
32,
97,
112,
112,
108,
105,
99,
97,
116,
105,
111,
110,
46,
10,
32,
32,
32,
32,
52,
46,
32,
73,
110,
115,
112,
101,
99,
116,
32,
116,
104,
101,
32,
114,
101,
115,
117,
108,
116,
105,
110,
103,
32,
111,
117,
116,
112,
117,
116,
32,
68,
117,
112,
101,
46,
106,
97,
118,
97,
44,
32,
119,
104,
105,
99,
104,
32,
119,
105,
108,
108,
32,
98,
101,
32,
101,
120,
97,
99,
116,
108,
121,
32,
116,
104,
101,
10,
32,
32,
32,
32,
32,
32,
32,
115,
97,
109,
101,
32,
97,
115,
32,
116,
104,
101,
32,
111,
114,
105,
103,
105,
110,
97,
108,
46,
10,
10,
32,
32,
32,
32,
73,
110,
32,
97,
100,
100,
105,
116,
105,
111,
110,
32,
116,
111,
32,
114,
101,
112,
114,
111,
100,
117,
99,
105,
110,
103,
32,
105,
116,
115,
101,
108,
102,
44,
32,
116,
104,
101,
32,
97,
112,
112,
108,
105,
99,
97,
116,
105,
111,
110,
32,
101,
99,
104,
111,
101,
115,
32,
97,
32,
119,
105,
115,
101,
99,
114,
97,
99,
107,
10,
32,
32,
32,
32,
116,
111,
32,
116,
104,
101,
32,
115,
116,
97,
110,
100,
97,
114,
100,
32,
111,
117,
116,
112,
117,
116,
46,
32,
32,
42,
47,
10,
10,
105,
109,
112,
111,
114,
116,
32,
106,
97,
118,
97,
46,
105,
111,
46,
42,
59,
10,
99,
108,
97,
115,
115,
32,
68,
117,
112,
101,
32,
123,
10,
32,
32,
32,
32,
112,
117,
98,
108,
105,
99,
32,
115,
116,
97,
116,
105,
99,
32,
118,
111,
105,
100,
32,
109,
97,
105,
110,
32,
40,
83,
116,
114,
105,
110,
103,
91,
93,
32,
97,
114,
103,
118,
41,
32,
123,
10,
};
int[] src2 = {
32,
32,
32,
32,
32,
32,
32,
32,
98,
121,
116,
101,
91,
93,
32,
98,
101,
103,
105,
110,
110,
105,
110,
103,
32,
61,
32,
110,
101,
119,
32,
98,
121,
116,
101,
91,
115,
114,
99,
49,
46,
108,
101,
110,
103,
116,
104,
93,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
102,
111,
114,
32,
40,
105,
110,
116,
32,
105,
61,
48,
59,
32,
105,
60,
115,
114,
99,
49,
46,
108,
101,
110,
103,
116,
104,
59,
32,
105,
43,
43,
41,
32,
123,
10,
32,
32,
32,
32,
32,
32,
32,
32,
32,
32,
32,
32,
98,
101,
103,
105,
110,
110,
105,
110,
103,
91,
105,
93,
32,
61,
32,
40,
98,
121,
116,
101,
41,
32,
115,
114,
99,
49,
91,
105,
93,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
125,
10,
32,
32,
32,
32,
32,
32,
32,
32,
116,
114,
121,
32,
123,
10,
32,
32,
32,
32,
32,
32,
32,
32,
80,
114,
105,
110,
116,
83,
116,
114,
101,
97,
109,
32,
111,
117,
116,
101,
114,
32,
61,
32,
110,
101,
119,
32,
80,
114,
105,
110,
116,
83,
116,
114,
101,
97,
109,
40,
110,
101,
119,
32,
70,
105,
108,
101,
79,
117,
116,
112,
117,
116,
83,
116,
114,
101,
97,
109,
40,
34,
68,
117,
112,
101,
46,
106,
97,
118,
97,
34,
41,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
98,
101,
103,
105,
110,
110,
105,
110,
103,
44,
32,
48,
44,
32,
98,
101,
103,
105,
110,
110,
105,
110,
103,
46,
108,
101,
110,
103,
116,
104,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
49,
48,
53,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
49,
49,
48,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
49,
49,
54,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
57,
49,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
57,
51,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
51,
50,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
49,
49,
53,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
49,
49,
52,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
57,
57,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
52,
57,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
51,
50,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
54,
49,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
51,
50,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
49,
50,
51,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
49,
48,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
102,
111,
114,
32,
40,
105,
110,
116,
32,
105,
61,
48,
59,
32,
105,
60,
115,
114,
99,
49,
46,
108,
101,
110,
103,
116,
104,
59,
32,
105,
43,
43,
41,
32,
123,
10,
32,
32,
32,
32,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
112,
114,
105,
110,
116,
40,
115,
114,
99,
49,
91,
105,
93,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
52,
52,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
49,
48,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
125,
10,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
49,
50,
53,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
53,
57,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
49,
48,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
98,
121,
116,
101,
91,
93,
32,
101,
110,
100,
32,
61,
32,
110,
101,
119,
32,
98,
121,
116,
101,
91,
115,
114,
99,
50,
46,
108,
101,
110,
103,
116,
104,
93,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
102,
111,
114,
32,
40,
105,
110,
116,
32,
105,
61,
48,
59,
32,
105,
60,
115,
114,
99,
50,
46,
108,
101,
110,
103,
116,
104,
59,
32,
105,
43,
43,
41,
32,
123,
10,
32,
32,
32,
32,
32,
32,
32,
32,
32,
32,
32,
32,
101,
110,
100,
91,
105,
93,
32,
61,
32,
40,
98,
121,
116,
101,
41,
32,
115,
114,
99,
50,
91,
105,
93,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
125,
10,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
49,
48,
53,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
49,
49,
48,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
49,
49,
54,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
57,
49,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
57,
51,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
51,
50,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
49,
49,
53,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
49,
49,
52,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
57,
57,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
53,
48,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
51,
50,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
54,
49,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
51,
50,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
49,
50,
51,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
49,
48,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
102,
111,
114,
32,
40,
105,
110,
116,
32,
105,
61,
48,
59,
32,
105,
60,
115,
114,
99,
50,
46,
108,
101,
110,
103,
116,
104,
59,
32,
105,
43,
43,
41,
32,
123,
10,
32,
32,
32,
32,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
112,
114,
105,
110,
116,
40,
115,
114,
99,
50,
91,
105,
93,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
52,
52,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
49,
48,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
125,
10,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
49,
50,
53,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
53,
57,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
49,
48,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
119,
114,
105,
116,
101,
40,
101,
110,
100,
44,
32,
48,
44,
32,
101,
110,
100,
46,
108,
101,
110,
103,
116,
104,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
111,
117,
116,
101,
114,
46,
99,
108,
111,
115,
101,
40,
41,
59,
10,
32,
32,
32,
32,
32,
32,
32,
32,
125,
32,
99,
97,
116,
99,
104,
32,
40,
73,
79,
69,
120,
99,
101,
112,
116,
105,
111,
110,
32,
105,
111,
101,
41,
32,
123,
125,
10,
32,
32,
32,
32,
32,
32,
32,
32,
83,
121,
115,
116,
101,
109,
46,
111,
117,
116,
46,
112,
114,
105,
110,
116,
108,
110,
40,
34,
85,
78,
73,
88,
32,
97,
110,
100,
32,
74,
97,
118,
97,
32,
118,
105,
114,
117,
115,
101,
115,
32,
100,
111,
32,
110,
111,
116,
32,
101,
120,
105,
115,
116,
46,
34,
41,
59,
10,
32,
32,
32,
32,
125,
10,
125,
10,
};
        byte[] beginning = new byte[src1.length];
        for (int i=0; i<src1.length; i++) {
            beginning[i] = (byte) src1[i];
        }
        try {
        PrintStream outer = new PrintStream(new FileOutputStream("Dupe.java"));
        outer.write(beginning, 0, beginning.length);
        outer.write(105);
        outer.write(110);
        outer.write(116);
        outer.write(91);
        outer.write(93);
        outer.write(32);
        outer.write(115);
        outer.write(114);
        outer.write(99);
        outer.write(49);
        outer.write(32);
        outer.write(61);
        outer.write(32);
        outer.write(123);
        outer.write(10);
        for (int i=0; i<src1.length; i++) {
            outer.print(src1[i]);
            outer.write(44);
            outer.write(10);
        }
        outer.write(125);
        outer.write(59);
        outer.write(10);
        byte[] end = new byte[src2.length];
        for (int i=0; i<src2.length; i++) {
            end[i] = (byte) src2[i];
        }
        outer.write(105);
        outer.write(110);
        outer.write(116);
        outer.write(91);
        outer.write(93);
        outer.write(32);
        outer.write(115);
        outer.write(114);
        outer.write(99);
        outer.write(50);
        outer.write(32);
        outer.write(61);
        outer.write(32);
        outer.write(123);
        outer.write(10);
        for (int i=0; i<src2.length; i++) {
            outer.print(src2[i]);
            outer.write(44);
            outer.write(10);
        }
        outer.write(125);
        outer.write(59);
        outer.write(10);
        outer.write(end, 0, end.length);
        outer.close();
        } catch (IOException ioe) {}
        System.out.println("UNIX and Java viruses do not exist.");
    }
}
