xref: /titanic_44/usr/src/lib/libshell/common/tests/functions.sh (revision 3e14f97f673e8a630f076077de35afdd43dc1587)
1da2e3ebdSchin########################################################################
2da2e3ebdSchin#                                                                      #
3da2e3ebdSchin#               This software is part of the ast package               #
4*3e14f97fSRoger A. Faulkner#          Copyright (c) 1982-2010 AT&T Intellectual Property          #
5da2e3ebdSchin#                      and is licensed under the                       #
6da2e3ebdSchin#                  Common Public License, Version 1.0                  #
77c2fbfb3SApril Chin#                    by AT&T Intellectual Property                     #
8da2e3ebdSchin#                                                                      #
9da2e3ebdSchin#                A copy of the License is available at                 #
10da2e3ebdSchin#            http://www.opensource.org/licenses/cpl1.0.txt             #
11da2e3ebdSchin#         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         #
12da2e3ebdSchin#                                                                      #
13da2e3ebdSchin#              Information and Software Systems Research               #
14da2e3ebdSchin#                            AT&T Research                             #
15da2e3ebdSchin#                           Florham Park NJ                            #
16da2e3ebdSchin#                                                                      #
17da2e3ebdSchin#                  David Korn <dgk@research.att.com>                   #
18da2e3ebdSchin#                                                                      #
19da2e3ebdSchin########################################################################
20da2e3ebdSchinfunction err_exit
21da2e3ebdSchin{
22da2e3ebdSchin	print -u2 -n "\t"
23da2e3ebdSchin	print -u2 -r ${Command}[$1]: "${@:2}"
24da2e3ebdSchin	let Errors+=1
25da2e3ebdSchin}
26da2e3ebdSchinalias err_exit='err_exit $LINENO'
27da2e3ebdSchin
28da2e3ebdSchininteger Errors=0
29da2e3ebdSchinCommand=${0##*/}
307c2fbfb3SApril Chin
3134f9b3eeSRoland Mainzulimit -c 0
3234f9b3eeSRoland Mainz
3334f9b3eeSRoland Mainztmp=$(mktemp -dt) || { err_exit mktemp -dt failed; exit 1; }
3434f9b3eeSRoland Mainztrap "cd /; rm -rf $tmp" EXIT
357c2fbfb3SApril Chin
36da2e3ebdSchininteger foo=33
37da2e3ebdSchinbar=bye
38da2e3ebdSchin# check for global variables and $0
39da2e3ebdSchinfunction foobar
40da2e3ebdSchin{
41da2e3ebdSchin	case $1 in
42da2e3ebdSchin	1) 	print -r - "$foo" "$bar";;
43da2e3ebdSchin	2)	print -r - "$0";;
44da2e3ebdSchin	3)	typeset foo=foo
45da2e3ebdSchin		integer bar=10
46da2e3ebdSchin	 	print -r - "$foo" "$bar";;
47da2e3ebdSchin	4)	trap 'foo=36' EXIT
48da2e3ebdSchin		typeset foo=20;;
49da2e3ebdSchin	esac
50da2e3ebdSchin}
51da2e3ebdSchinfunction print
52da2e3ebdSchin{
53da2e3ebdSchin	command print hi
54da2e3ebdSchin}
55da2e3ebdSchinif	[[ $(print) != hi ]]
56da2e3ebdSchinthen	err_exit "command print not working inside print function"
57da2e3ebdSchinfi
58da2e3ebdSchinunset -f print
59da2e3ebdSchin
60da2e3ebdSchinif	[[ $(foobar 1) != '33 bye' ]]
61da2e3ebdSchinthen	err_exit 'global variables not correct'
62da2e3ebdSchinfi
63da2e3ebdSchin
64da2e3ebdSchinif	[[ $(foobar 2) != 'foobar' ]]
65da2e3ebdSchinthen	err_exit '$0  not correct'
66da2e3ebdSchinfi
67da2e3ebdSchin
68da2e3ebdSchinif	[[ $(bar=foo foobar 1) != '33 foo' ]]
69da2e3ebdSchinthen	err_exit 'environment override not correct'
70da2e3ebdSchinfi
71da2e3ebdSchinif	[[ $bar == foo ]]
72da2e3ebdSchinthen	err_exit 'scoping error'
73da2e3ebdSchinfi
74da2e3ebdSchin
75da2e3ebdSchinif	[[ $(foobar 3) != 'foo 10' ]]
76da2e3ebdSchinthen	err_exit non-local variables
77da2e3ebdSchinfi
78da2e3ebdSchin
79da2e3ebdSchinfoobar 4
80da2e3ebdSchinif	[[ $foo != 36 ]]
81da2e3ebdSchinthen	err_exit EXIT trap in wrong scope
82da2e3ebdSchinfi
83da2e3ebdSchinunset -f foobar || err_exit "cannot unset function foobar"
84da2e3ebdSchintypeset -f foobar>/dev/null  && err_exit "typeset -f has incorrect exit status"
85da2e3ebdSchin
86da2e3ebdSchinfunction foobar
87da2e3ebdSchin{
88da2e3ebdSchin	(return 0)
89da2e3ebdSchin}
9034f9b3eeSRoland Mainz> $tmp/test1
91da2e3ebdSchin{
92da2e3ebdSchinfoobar
9334f9b3eeSRoland Mainzif	[ -r $tmp/test1 ]
9434f9b3eeSRoland Mainzthen	rm -r $tmp/test1
95da2e3ebdSchinelse	err_exit 'return within subshell inside function error'
96da2e3ebdSchinfi
97da2e3ebdSchin}
98da2e3ebdSchinabc() print hi
99da2e3ebdSchinif	[[ $(abc) != hi ]]
100da2e3ebdSchinthen	err_exit 'abc() print hi not working'
101da2e3ebdSchinfi
102da2e3ebdSchin( unset -f abc )
103da2e3ebdSchinif	[[ $(abc 2>/dev/null) != hi ]]
104da2e3ebdSchinthen	err_exit 'abc() print hi not working after subshell unset'
105da2e3ebdSchinfi
106da2e3ebdSchin(
107da2e3ebdSchin	function f
108da2e3ebdSchin	{
109da2e3ebdSchin		exit 1
110da2e3ebdSchin	}
111da2e3ebdSchin	f
112da2e3ebdSchin	err_exit 'exit from function not working'
113da2e3ebdSchin)
114da2e3ebdSchinunset -f foo
115da2e3ebdSchinfunction foo
116da2e3ebdSchin{
117da2e3ebdSchin	x=2
118da2e3ebdSchin	(
119da2e3ebdSchin		x=3
1207c2fbfb3SApril Chin		cd $tmp
121da2e3ebdSchin		print bar
122da2e3ebdSchin	)
123da2e3ebdSchin	if	[[ $x != 2 ]]
124da2e3ebdSchin	then	err_exit 'value of x not restored after subshell inside function'
125da2e3ebdSchin	fi
126da2e3ebdSchin}
127da2e3ebdSchinx=1
128da2e3ebdSchindir=$PWD
129da2e3ebdSchinif	[[ $(foo) != bar ]]
130da2e3ebdSchinthen	err_exit 'cd inside nested subshell not working'
131da2e3ebdSchinfi
132da2e3ebdSchinif	[[ $PWD != "$dir" ]]
133da2e3ebdSchinthen	err_exit 'cd inside nested subshell changes $PWD'
134da2e3ebdSchinfi
135da2e3ebdSchinfun() /bin/echo hello
136da2e3ebdSchinif	[[ $(fun) != hello ]]
137da2e3ebdSchinthen	err_exit one line functions not working
138da2e3ebdSchinfi
13934f9b3eeSRoland Mainzcat > $tmp/script <<-\!
140da2e3ebdSchin	print -r -- "$1"
141da2e3ebdSchin!
14234f9b3eeSRoland Mainzchmod +x $tmp/script
143da2e3ebdSchinfunction passargs
144da2e3ebdSchin{
14534f9b3eeSRoland Mainz	$tmp/script "$@"
146da2e3ebdSchin}
147da2e3ebdSchinif	[[ $(passargs one) != one ]]
148da2e3ebdSchinthen	err_exit 'passing args from functions to scripts not working'
149da2e3ebdSchinfi
15034f9b3eeSRoland Mainzcat > $tmp/script <<-\!
151da2e3ebdSchin	trap 'exit 0' EXIT
152da2e3ebdSchin	function foo
153da2e3ebdSchin	{
154da2e3ebdSchin		/tmp > /dev/null 2>&1
155da2e3ebdSchin	}
156da2e3ebdSchin	foo
157da2e3ebdSchin!
15834f9b3eeSRoland Mainzif	! $tmp/script
159da2e3ebdSchinthen	err_exit 'exit trap incorrectly triggered'
160da2e3ebdSchinfi
16134f9b3eeSRoland Mainzif	! $SHELL -c $tmp/script
162da2e3ebdSchinthen	err_exit 'exit trap incorrectly triggered when invoked with -c'
163da2e3ebdSchinfi
16434f9b3eeSRoland Mainz$SHELL -c "trap 'rm $tmp/script' EXIT"
16534f9b3eeSRoland Mainzif	[[ -f $tmp/script ]]
166da2e3ebdSchinthen	err_exit 'exit trap not triggered when invoked with -c'
167da2e3ebdSchinfi
16834f9b3eeSRoland Mainzcat > $tmp/script <<- \EOF
169da2e3ebdSchin	foobar()
170da2e3ebdSchin	{
171da2e3ebdSchin		return
172da2e3ebdSchin	}
173da2e3ebdSchin	shift
174da2e3ebdSchin	foobar
175da2e3ebdSchin	print -r -- "$1"
176da2e3ebdSchinEOF
17734f9b3eeSRoland Mainzchmod +x $tmp/script
17834f9b3eeSRoland Mainzif	[[ $( $SHELL $tmp/script arg1 arg2) != arg2 ]]
179da2e3ebdSchinthen	err_exit 'arguments not restored by posix functions'
180da2e3ebdSchinfi
181da2e3ebdSchinfunction foo
182da2e3ebdSchin{
183da2e3ebdSchin	print hello
184da2e3ebdSchin}
185da2e3ebdSchin(
186da2e3ebdSchin	function foo
187da2e3ebdSchin	{
188da2e3ebdSchin		print bar
189da2e3ebdSchin	}
190da2e3ebdSchin	if [[ $(foo) != bar ]]
191da2e3ebdSchin	then	err_exit 'function definitions inside subshells not working'
192da2e3ebdSchin	fi
193da2e3ebdSchin)
194da2e3ebdSchinif [[ $(foo) != hello ]]
195da2e3ebdSchinthen	err_exit 'function definitions inside subshells not restored'
196da2e3ebdSchinfi
197da2e3ebdSchinunset -f foo bar
198da2e3ebdSchinfunction bar
199da2e3ebdSchin{
200da2e3ebdSchin        print "$y"
201da2e3ebdSchin}
202da2e3ebdSchin
203da2e3ebdSchinfunction foo
204da2e3ebdSchin{
205da2e3ebdSchin        typeset x=3
206da2e3ebdSchin        y=$x bar
207da2e3ebdSchin}
208da2e3ebdSchinx=1
209da2e3ebdSchinif	[[ $(foo) != 3 ]]
210da2e3ebdSchinthen	err_exit 'variable assignment list not using parent scope'
211da2e3ebdSchinfi
21234f9b3eeSRoland Mainzunset -f foobar
21334f9b3eeSRoland Mainzcat > $tmp/foobar <<!
21434f9b3eeSRoland Mainzfunction foobar
215da2e3ebdSchin{
216da2e3ebdSchin	print foo
217da2e3ebdSchin}
218da2e3ebdSchin!
21934f9b3eeSRoland Mainzchmod +x $tmp/foobar
2207c2fbfb3SApril ChinFPATH=$tmp
22134f9b3eeSRoland Mainzautoload foobar
22234f9b3eeSRoland Mainzif	[[ $(foobar 2>/dev/null) != foo ]]
223da2e3ebdSchinthen	err_exit 'autoload not working'
224da2e3ebdSchinfi
225da2e3ebdSchinunset -f foobar
226da2e3ebdSchinfunction foobar
227da2e3ebdSchin{
228da2e3ebdSchin	typeset -r x=3
229da2e3ebdSchin	return 0
230da2e3ebdSchin}
231da2e3ebdSchin( foobar ) 2> /dev/null || err_exit "cannot unset readonly variable in function"
232da2e3ebdSchinif	$SHELL -n 2> /dev/null <<-!
233da2e3ebdSchin	abc()
234da2e3ebdSchin	!
235da2e3ebdSchinthen	err_exit 'abc() without a function body is not a syntax error'
236da2e3ebdSchinfi
237da2e3ebdSchinfunction winpath
238da2e3ebdSchin{
239da2e3ebdSchin	usage='q pathname ...'
240da2e3ebdSchin	typeset var format=s
241da2e3ebdSchin	while   getopts  "$usage" var
242da2e3ebdSchin	do      case $var in
243da2e3ebdSchin		q)      format=q;;
244da2e3ebdSchin	        esac
245da2e3ebdSchin	done
246da2e3ebdSchin	print done
247da2e3ebdSchin}
248da2e3ebdSchinif	[[ $( (winpath --man 2>/dev/null); print ok) != ok ]]
249da2e3ebdSchinthen	err_exit 'getopts --man in functions not working'
250da2e3ebdSchinfi
251da2e3ebdSchinif	[[ $( (winpath -z 2>/dev/null); print ok) != ok ]]
252da2e3ebdSchinthen	err_exit 'getopts with bad option in functions not working'
253da2e3ebdSchinfi
254da2e3ebdSchinunset -f x
255da2e3ebdSchinfunction x
256da2e3ebdSchin{
257da2e3ebdSchin        print "$@"
258da2e3ebdSchin}
259da2e3ebdSchintypeset -ft x
260da2e3ebdSchinif      [[ $(x x=y 2>/dev/null) != x=y ]]
261da2e3ebdSchinthen    err_exit 'name=value pair args not passed to traced functions'
262da2e3ebdSchinfi
263da2e3ebdSchinfunction bad
264da2e3ebdSchin{
265da2e3ebdSchin	false
266da2e3ebdSchin}
267da2e3ebdSchintrap 'val=false' ERR
268da2e3ebdSchinval=true
269da2e3ebdSchinbad
270da2e3ebdSchinif	[[ $val != false ]]
271da2e3ebdSchinthen	err_exit 'set -e not working for functions'
272da2e3ebdSchinfi
273da2e3ebdSchinfunction bad
274da2e3ebdSchin{
275da2e3ebdSchin	false
276da2e3ebdSchin	return 0
277da2e3ebdSchin}
278da2e3ebdSchinval=true
279da2e3ebdSchinbad
280da2e3ebdSchinif	[[ $val != true ]]
281da2e3ebdSchinthen	err_exit 'set -e not disabled for functions'
282da2e3ebdSchinfi
283da2e3ebdSchinbad()
284da2e3ebdSchin{
285da2e3ebdSchin	false
286da2e3ebdSchin	return 0
287da2e3ebdSchin}
288da2e3ebdSchinval=true
289da2e3ebdSchinbad
290da2e3ebdSchinif	[[ $val != false ]]
291da2e3ebdSchinthen	err_exit 'set -e not inherited for posix functions'
292da2e3ebdSchinfi
2937c2fbfb3SApril Chintrap - ERR
2947c2fbfb3SApril Chin
295da2e3ebdSchinfunction myexport
296da2e3ebdSchin{
297da2e3ebdSchin	nameref var=$1
298da2e3ebdSchin	if	(( $# > 1 ))
299da2e3ebdSchin	then	export	$1=$2
300da2e3ebdSchin	fi
301da2e3ebdSchin	if	(( $# > 2 ))
302da2e3ebdSchin	then	print $(myexport "$1" "$3" )
303da2e3ebdSchin		return
304da2e3ebdSchin	fi
305da2e3ebdSchin	typeset val
306da2e3ebdSchin	val=$(export | grep "^$1=")
307da2e3ebdSchin	print ${val#"$1="}
308da2e3ebdSchin}
309da2e3ebdSchinexport dgk=base
3107c2fbfb3SApril Chinval=$(myexport dgk fun)
3117c2fbfb3SApril Chinif	[[ $val != fun ]]
3127c2fbfb3SApril Chinthen	err_exit "export inside function not working -- expected 'fun', got '$val'"
313da2e3ebdSchinfi
3147c2fbfb3SApril Chinval=$(export | sed -e '/^dgk=/!d' -e 's/^dgk=//')
3157c2fbfb3SApril Chinif	[[ $val != base ]]
3167c2fbfb3SApril Chinthen	err_exit "export not restored after function call -- expected 'base', got '$val'"
317da2e3ebdSchinfi
3187c2fbfb3SApril Chinval=$(myexport dgk fun fun2)
3197c2fbfb3SApril Chinif	[[ $val != fun2 ]]
3207c2fbfb3SApril Chinthen	err_exit "export inside function not working with recursive function -- expected 'fun2', got '$val'"
321da2e3ebdSchinfi
3227c2fbfb3SApril Chinval=$(export | sed -e '/^dgk=/!d' -e 's/^dgk=//')
3237c2fbfb3SApril Chinif	[[ $val != base ]]
3247c2fbfb3SApril Chinthen	err_exit "export not restored after recursive function call -- expected 'base', got '$val'"
325da2e3ebdSchinfi
3267c2fbfb3SApril Chinval=$(dgk=try3 myexport dgk)
3277c2fbfb3SApril Chinif	[[ $val != try3 ]]
3287c2fbfb3SApril Chinthen	err_exit "name=value not added to export list with function call -- expected 'try3', got '$val'"
329da2e3ebdSchinfi
3307c2fbfb3SApril Chinval=$(export | sed -e '/^dgk=/!d' -e 's/^dgk=//')
3317c2fbfb3SApril Chinif	[[ $val != base ]]
3327c2fbfb3SApril Chinthen	err_exit "export not restored name=value function call -- expected 'base', got '$val'"
333da2e3ebdSchinfi
334da2e3ebdSchinunset zzz
3357c2fbfb3SApril Chinval=$(myexport zzz fun)
3367c2fbfb3SApril Chinif	[[ $val != fun ]]
3377c2fbfb3SApril Chinthen	err_exit "export inside function not working -- expected 'fun', got '$val'"
338da2e3ebdSchinfi
3397c2fbfb3SApril Chinval=$(export | sed -e '/^zzz=/!d' -e 's/^zzz=//')
3407c2fbfb3SApril Chinif	[[ $val ]]
3417c2fbfb3SApril Chinthen	err_exit "unset varaible exported after function call -- expected '', got '$val'"
342da2e3ebdSchinfi
3437c2fbfb3SApril Chin
344da2e3ebdSchinunset zzz
345da2e3ebdSchintypeset -u zzz
346da2e3ebdSchinfunction foo
347da2e3ebdSchin{
348da2e3ebdSchin	zzz=abc
349da2e3ebdSchin	print $zzz
350da2e3ebdSchin}
351da2e3ebdSchinif	[[ $(foo)$(foo) != ABCABC ]]
352da2e3ebdSchinthen	err_exit 'attributes on unset variables not saved/restored'
353da2e3ebdSchinfi
354da2e3ebdSchinfunction xpd {
355da2e3ebdSchin	typeset i j=$1
356da2e3ebdSchin                for i
357da2e3ebdSchin                        do print i=$i j=$j
358da2e3ebdSchin                        [[ $i == a ]] && xpd b
359da2e3ebdSchin                        done
360da2e3ebdSchin                }
361da2e3ebdSchinif	[[ $(xpd a c) != $'i=a j=a\ni=b j=b\ni=c j=a' ]]
362da2e3ebdSchinthen	err_exit 'for loop function optimization error'
363da2e3ebdSchinfi
364da2e3ebdSchin
365da2e3ebdSchintypeset -A visited
366da2e3ebdSchininteger level=0
367da2e3ebdSchinfunction closure
368da2e3ebdSchin{
369da2e3ebdSchin	(( $# > 5 )) && return 1
370da2e3ebdSchin	((level < 2)) && ((level++))
371da2e3ebdSchin	typeset tmp r=0
372da2e3ebdSchin	visited[$1]=1
373da2e3ebdSchin
374da2e3ebdSchin	for tmp in $level _$level
375da2e3ebdSchin	do
376da2e3ebdSchin		[[ ${visited[$tmp]} == 1 ]] && continue
377da2e3ebdSchin		closure $tmp $* || r=1
378da2e3ebdSchin	done
379da2e3ebdSchin	return $r
380da2e3ebdSchin}
381da2e3ebdSchinclosure 0 || err_exit -u2 'for loop function optimization bug2'
38234f9b3eeSRoland Mainzdir=$tmp/dir
38334f9b3eeSRoland Mainzmkdir $dir
38434f9b3eeSRoland Mainzcd $dir || { err_exit "cd $dir failed"; exit 1; }
38534f9b3eeSRoland Mainz
38634f9b3eeSRoland Mainz(
38734f9b3eeSRoland Mainz	function a {
38834f9b3eeSRoland Mainz		print a
38934f9b3eeSRoland Mainz	}
39034f9b3eeSRoland Mainz	function b {
39134f9b3eeSRoland Mainz		print 1
39234f9b3eeSRoland Mainz		a
39334f9b3eeSRoland Mainz		print 2
39434f9b3eeSRoland Mainz	} > /dev/null
39534f9b3eeSRoland Mainz	typeset -ft a b
39634f9b3eeSRoland Mainz	PS4=X
39734f9b3eeSRoland Mainz	b
39834f9b3eeSRoland Mainz) > file 2>&1
39934f9b3eeSRoland Mainz[[ $(<file) == *'Xprint 2'* ]] ||  err_exit 'function trace disabled by function call'
40034f9b3eeSRoland Mainzrm -f file
40134f9b3eeSRoland Mainz
402da2e3ebdSchinprint 'false' > try
403da2e3ebdSchinchmod +x try
404da2e3ebdSchincat > tst <<- EOF
405da2e3ebdSchin	function ignore
406da2e3ebdSchin	{
407da2e3ebdSchin		./try
408da2e3ebdSchin		return 0
409da2e3ebdSchin	}
410da2e3ebdSchin	trap "print error; exit 1" ERR
411da2e3ebdSchin	ignore
412da2e3ebdSchinEOF
413da2e3ebdSchinif	[[ $($SHELL < tst)  == error ]]
414da2e3ebdSchinthen	err_exit 'ERR trap not cleared'
415da2e3ebdSchinfi
41634f9b3eeSRoland MainzFPATH=$dir
41734f9b3eeSRoland Mainzprint ': This does nothing' > foobar
41834f9b3eeSRoland Mainzchmod +x foobar
419da2e3ebdSchinunset -f foobar
420da2e3ebdSchin{ foobar; } 2>/dev/null
42134f9b3eeSRoland Mainzgot=$?
42234f9b3eeSRoland Mainzexp=126
42334f9b3eeSRoland Mainzif	[[ $got != $exp ]]
42434f9b3eeSRoland Mainzthen	err_exit "function file without function definition processes wrong error -- expected '$exp', got '$got'"
425da2e3ebdSchinfi
426da2e3ebdSchinprint 'set a b c' > dotscript
427da2e3ebdSchin[[ $(PATH=$PATH: $SHELL -c '. dotscript;print $#') == 3 ]] || err_exit 'positional parameters not preserved with . script without arguments'
428da2e3ebdSchincd ~- || err_exit "cd back failed"
429da2e3ebdSchinfunction errcheck
430da2e3ebdSchin{
431da2e3ebdSchin	trap 'print ERR; return 1' ERR
432da2e3ebdSchin	false
433da2e3ebdSchin	print ok
434da2e3ebdSchin}
435da2e3ebdSchinerr=$(errcheck)
436da2e3ebdSchin[[ $err == ERR ]] || err_exit 'trap on ERR not working in a function'
437da2e3ebdSchinx="$(
438da2e3ebdSchin	function foobar
439da2e3ebdSchin	{
440da2e3ebdSchin		print ok
441da2e3ebdSchin	}
442da2e3ebdSchin	typeset -f foobar
443da2e3ebdSchin)"
444da2e3ebdSchineval "$x"  || err_exit 'typeset -f generates syntax error'
445da2e3ebdSchin[[ $(foobar) != ok ]] && err_exit 'typeset -f not generating function'
446da2e3ebdSchinunset -f a b c
447da2e3ebdSchina()
448da2e3ebdSchin{
449da2e3ebdSchin        b
450da2e3ebdSchin        b
451da2e3ebdSchin        print ${.sh.fun}
452da2e3ebdSchin}
453da2e3ebdSchinb() { : ;}
454da2e3ebdSchin[[ $(a) == a ]] || err_exit '.sh.fun not set correctly in a function'
455da2e3ebdSchinprint $'a(){\ndate\n}'  | $SHELL 2> /dev/null || err_exit 'parser error in a(){;date;}'
45634f9b3eeSRoland Mainzcat > $tmp/data1 << '++EOF'
457da2e3ebdSchin     1  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
458da2e3ebdSchin     2  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
459da2e3ebdSchin     3  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
460da2e3ebdSchin     4  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
461da2e3ebdSchin     5  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
462da2e3ebdSchin     6  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
463da2e3ebdSchin     7  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
464da2e3ebdSchin     8  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
465da2e3ebdSchin     9  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
466da2e3ebdSchin    10  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
467da2e3ebdSchin    11  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
468da2e3ebdSchin    12  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
469da2e3ebdSchin    13  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
470da2e3ebdSchin    14  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
471da2e3ebdSchin    15  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
472da2e3ebdSchin    16  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
473da2e3ebdSchin    17  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
474da2e3ebdSchin    18  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
475da2e3ebdSchin    19  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
476da2e3ebdSchin    20  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
477da2e3ebdSchin++EOF
47834f9b3eeSRoland Mainzcat > $tmp/script << '++EOF'
479da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
480da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
481da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
482da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
483da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
484da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
485da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
486da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
487da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
488da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
489da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
490da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
491da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
492da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
493da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
494da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
495da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
496da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
497da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
498da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
499da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
500da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
501da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
502da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
503da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
504da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
505da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
506da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
507da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
508da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
509da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
510da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
511da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
512da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
513da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
514da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
515da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
516da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
517da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
518da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
519da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
520da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
521da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
522da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
523da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
524da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
525da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
526da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
527da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
528da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
529da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
530da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
531da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
532da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
533da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
534da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
535da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
536da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
537da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
538da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
539da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
540da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
541da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
542da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
543da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
544da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
545da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
546da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
547da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
548da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
549da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
550da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
551da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
552da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
553da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
554da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
555da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
556da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
557da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
558da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
559da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
560da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
561da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
562da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
563da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
564da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
565da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
566da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
567da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
568da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
569da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
570da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
571da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
572da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
573da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
574da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
575da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
576da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
577da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
578da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
579da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
580da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
581da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
582da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
583da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
584da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
585da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
586da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
587da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
588da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
589da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
590da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
591da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
592da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
593da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
594da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
595da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
596da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
597da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
598da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
599da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
600da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
601da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
602da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
603da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
604da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
605da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
606da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
607da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
608da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
609da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
610da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
611da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
612da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
613da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
614da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
615da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
616da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
617da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
618da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
619da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
620da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
621da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
622da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
623da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
624da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
625da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
626da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
627da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
628da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
629da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
630da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
631da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
632da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
633da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
634da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
635da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
636da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
637da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
638da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
639da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
640da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
641da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
642da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
643da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
644da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
645da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
646da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
647da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
648da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
649da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
650da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
651da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
652da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
653da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
654da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
655da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
656da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
657da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
658da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
659da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
660da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
661da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
662da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
663da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
664da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
665da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
666da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
667da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
668da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
669da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
670da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
671da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
672da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
673da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
674da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
675da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
676da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
677da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
678da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
679da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
680da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
681da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
682da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
683da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
684da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
685da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
686da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
687da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
688da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
689da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
690da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
691da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
692da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
693da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
694da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
695da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
696da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
697da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
698da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
699da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
700da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
701da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
702da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
703da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
704da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
705da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
706da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
707da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
708da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
709da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
710da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
711da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
712da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
713da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
714da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
715da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
716da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
717da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
718da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
719da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
720da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
721da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
722da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
723da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
724da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
725da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
726da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
727da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
728da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
729da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
730da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
731da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
732da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
733da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
734da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
735da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
736da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
737da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
738da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
739da2e3ebdSchin
740da2e3ebdSchinf()
741da2e3ebdSchin{
742da2e3ebdSchincat <<\M
743da2e3ebdSchin++EOF
74434f9b3eeSRoland Mainzcat $tmp/data1 >> $tmp/script
74534f9b3eeSRoland Mainzprintf 'M\n}\n\nf\n\n' >> $tmp/script
74634f9b3eeSRoland Mainz$SHELL -c $tmp/script  > $tmp/data2
74734f9b3eeSRoland Mainzcmp -s $tmp/data[12] || err_exit 'error with long functions'
748da2e3ebdSchinv=1
749da2e3ebdSchinfunction f
750da2e3ebdSchin{
751da2e3ebdSchin	typeset i
752da2e3ebdSchin	for i in 0 1
753da2e3ebdSchin	do	typeset v
754da2e3ebdSchin		v=$i
755da2e3ebdSchin		[[ $v == $i ]] || return 1
756da2e3ebdSchin	done
757da2e3ebdSchin}
758da2e3ebdSchinf || err_exit "typeset optimization bug"
759da2e3ebdSchinfunction f
760da2e3ebdSchin{
761da2e3ebdSchin	print -r -- "$foo$bar"
762da2e3ebdSchin}
763da2e3ebdSchinfunction g
764da2e3ebdSchin{
765da2e3ebdSchin	print -r -- $(bar=bam f)
766da2e3ebdSchin}
767da2e3ebdSchinunset foo bar
768da2e3ebdSchin[[ $(foo=hello g) == hellobam ]] || err_exit 'function exports not passed on'
769da2e3ebdSchin[[ $(bar=hello g) == bam ]] || err_exit 'function exports not overridden'
770da2e3ebdSchinunset -f foo
771da2e3ebdSchinfunction foo
772da2e3ebdSchin{
773da2e3ebdSchin	typeset line=$1
774da2e3ebdSchin	set +n
775da2e3ebdSchin	while	[[ $line ]]
776da2e3ebdSchin	do	if	[[ ! $varname ]]
777da2e3ebdSchin		then	varname=${line%% *}
778da2e3ebdSchin			line=${line##"$varname"?( )}
779da2e3ebdSchin			[[ $line ]] && continue
780da2e3ebdSchin		else	print ok
781da2e3ebdSchin			return
782da2e3ebdSchin		fi
783da2e3ebdSchin		varname=
784da2e3ebdSchin	done
785da2e3ebdSchin}
786da2e3ebdSchin[[ $(foo 'NUMBERED RECORDSIZE') == ok ]] || err_exit 'optimization error with undefined variable'
7877c2fbfb3SApril Chinunset x
7887c2fbfb3SApril Chinx=$(
7897c2fbfb3SApril Chin	set -e
7907c2fbfb3SApril Chin	integer count=0
7917c2fbfb3SApril Chin	function err_f
7927c2fbfb3SApril Chin	{
7937c2fbfb3SApril Chin		if	((count++==3))
7947c2fbfb3SApril Chin		then	print failed
7957c2fbfb3SApril Chin		else	false
7967c2fbfb3SApril Chin		fi
7977c2fbfb3SApril Chin	}
7987c2fbfb3SApril Chin	trap 'err_f' ERR
7997c2fbfb3SApril Chin	false
8007c2fbfb3SApril Chin)
8017c2fbfb3SApril Chin[[ $x == failed ]] && err_exit 'ERR trap executed multiple times'
8027c2fbfb3SApril Chinexport environment
8037c2fbfb3SApril Chintypeset global
8047c2fbfb3SApril Chinfunction f
8057c2fbfb3SApril Chin{
8067c2fbfb3SApril Chin	typeset i t local
8077c2fbfb3SApril Chin
8087c2fbfb3SApril Chin	for i
8097c2fbfb3SApril Chin	do	case $i in
8107c2fbfb3SApril Chin		[-+]*)	set "$@"
8117c2fbfb3SApril Chin			continue
8127c2fbfb3SApril Chin			;;
8137c2fbfb3SApril Chin		local)	local=f
8147c2fbfb3SApril Chin			t=$(typeset +f $local)
8157c2fbfb3SApril Chin			;;
8167c2fbfb3SApril Chin		global)	global=f
8177c2fbfb3SApril Chin			t=$(typeset +f $global)
8187c2fbfb3SApril Chin			;;
8197c2fbfb3SApril Chin		environment)
8207c2fbfb3SApril Chin			environment=f
8217c2fbfb3SApril Chin			t=$(typeset +f $environment)
8227c2fbfb3SApril Chin			;;
8237c2fbfb3SApril Chin		literal)t=$(typeset +f f)
8247c2fbfb3SApril Chin			;;
8257c2fbfb3SApril Chin		positional)
8267c2fbfb3SApril Chin			set -- f
8277c2fbfb3SApril Chin			t=$(typeset +f $1)
8287c2fbfb3SApril Chin			;;
8297c2fbfb3SApril Chin		esac
8307c2fbfb3SApril Chin		[[ $t ]] || err_exit "typeset +f \$$i failed"
8317c2fbfb3SApril Chin	done
8327c2fbfb3SApril Chin}
8337c2fbfb3SApril Chinf local global environment literal positional
8347c2fbfb3SApril Chin$SHELL -c '
83534f9b3eeSRoland Mainz	print exit 0 > '$tmp'/script
83634f9b3eeSRoland Mainz	chmod +x '$tmp'/script
8377c2fbfb3SApril Chin	unset var
8387c2fbfb3SApril Chin	var=( ident=1 )
8397c2fbfb3SApril Chin	function fun
8407c2fbfb3SApril Chin	{
84134f9b3eeSRoland Mainz		PATH='$tmp' script
8427c2fbfb3SApril Chin	}
8437c2fbfb3SApril Chin	fun
8447c2fbfb3SApril Chin' || err_exit "compound variable cleanup before script exec failed"
8457c2fbfb3SApril Chin( $SHELL << \++EOF++
8467c2fbfb3SApril Chinfunction main
8477c2fbfb3SApril Chin{
8487c2fbfb3SApril Chin 	typeset key
8497c2fbfb3SApril Chin 	typeset -A entry
8507c2fbfb3SApril Chin 	entry[a]=( value=aaa )
8517c2fbfb3SApril Chin}
8527c2fbfb3SApril Chinmain
8537c2fbfb3SApril Chin++EOF++
8547c2fbfb3SApril Chin) 2> /dev/null || err_exit 'function main fails'
8557c2fbfb3SApril Chinoptind=$OPTIND
8567c2fbfb3SApril Chinsub()
8577c2fbfb3SApril Chin{
8587c2fbfb3SApril Chin        (
8597c2fbfb3SApril Chin                OPTIND=1
8607c2fbfb3SApril Chin                while getopts :abc OPTION "$@"
8617c2fbfb3SApril Chin                do      print OPTIND=$OPTIND
8627c2fbfb3SApril Chin                done
8637c2fbfb3SApril Chin        )
8647c2fbfb3SApril Chin}
8657c2fbfb3SApril Chin[[ $(sub -a) == OPTIND=2 ]] || err_exit 'OPTIND should be 2'
8667c2fbfb3SApril Chin[[ $(sub -a) == OPTIND=2 ]] || err_exit 'OPTIND should be 2 again'
8677c2fbfb3SApril Chin[[ $OPTIND == "$optind" ]] || err_exit 'OPTIND should be 1'
8687c2fbfb3SApril Chin
8697c2fbfb3SApril Chinfunction bar
8707c2fbfb3SApril Chin{
8717c2fbfb3SApril Chin	[[ -o nounset ]] && err_exit  'nounset option should not be inherited'
8727c2fbfb3SApril Chin}
8737c2fbfb3SApril Chinfunction foo
8747c2fbfb3SApril Chin{
8757c2fbfb3SApril Chin	set -o nounset
8767c2fbfb3SApril Chin	bar
8777c2fbfb3SApril Chin}
8787c2fbfb3SApril Chinset +o nounset
8797c2fbfb3SApril Chinfoo
8807c2fbfb3SApril Chinfunction red
8817c2fbfb3SApril Chin{
8827c2fbfb3SApril Chin	integer -S d=0
8837c2fbfb3SApril Chin	printf 'red_one %d\n' d
8847c2fbfb3SApril Chin	(( d++ ))
8857c2fbfb3SApril Chin	return 0
8867c2fbfb3SApril Chin}
8877c2fbfb3SApril Chin[[ ${ red } != 'red_one 0' ]] && err_exit 'expected red_one 0'
8887c2fbfb3SApril Chin[[ ${ red } != 'red_one 1' ]] && err_exit 'expected red_one 1'
8897c2fbfb3SApril Chinxyz=$0
8907c2fbfb3SApril Chinfunction traceback
8917c2fbfb3SApril Chin{
8927c2fbfb3SApril Chin	integer .level=.sh.level
8937c2fbfb3SApril Chin	while((--.level>=0))
8947c2fbfb3SApril Chin	do
8957c2fbfb3SApril Chin		((.sh.level = .level))
8967c2fbfb3SApril Chin		[[ $xyz == "$0" ]] || err_exit "\$xyz=$xyz does not match $0 on level ${.level}"
8977c2fbfb3SApril Chin		[[ ${.sh.lineno} == "$1" ]] || err_exit "\${.sh.lineno}=${.sh.lineno} does not match $1 on level ${.level}"
8987c2fbfb3SApril Chin	done
8997c2fbfb3SApril Chin}
9007c2fbfb3SApril Chin
9017c2fbfb3SApril Chinfunction foo
9027c2fbfb3SApril Chin{
9037c2fbfb3SApril Chin	typeset xyz=foo
9047c2fbfb3SApril Chin	set -- $((LINENO+1))
9057c2fbfb3SApril Chin	bar $LINENO "$1"
9067c2fbfb3SApril Chin}
9077c2fbfb3SApril Chin
9087c2fbfb3SApril Chinfunction bar
9097c2fbfb3SApril Chin{
9107c2fbfb3SApril Chin    	typeset xyz=bar
9117c2fbfb3SApril Chin	set -- $((LINENO+2))
9127c2fbfb3SApril Chin	trap 'traceback $LINENO' DEBUG
9137c2fbfb3SApril Chin	: $LINENO "$1"
9147c2fbfb3SApril Chin}
9157c2fbfb3SApril Chin
9167c2fbfb3SApril Chinset -- $((LINENO+1))
9177c2fbfb3SApril Chinfoo $LINENO
9187c2fbfb3SApril Chinfunction .sh.fun.set
9197c2fbfb3SApril Chin{
9207c2fbfb3SApril Chin	print -r -- "${.sh.value}"
9217c2fbfb3SApril Chin}
9227c2fbfb3SApril Chinfunction abc
9237c2fbfb3SApril Chin{
9247c2fbfb3SApril Chin	:
9257c2fbfb3SApril Chin}
9267c2fbfb3SApril Chindef()
9277c2fbfb3SApril Chin{
9287c2fbfb3SApril Chin	:
9297c2fbfb3SApril Chin}
9307c2fbfb3SApril Chin[[ $(abc) == abc ]] || err_exit '.sh.fun.set not capturing function name'
9317c2fbfb3SApril Chin[[ $(def) == def ]] || err_exit '.sh.fun.set not capturing name()'
9327c2fbfb3SApril Chinunset -f .sh.fun.set
9337c2fbfb3SApril Chin
9347c2fbfb3SApril Chin# tests for debug functions
9357c2fbfb3SApril Chinbasefile=${.sh.file}
9367c2fbfb3SApril Chininteger baseline
93734f9b3eeSRoland Mainzcat > $tmp/debug << \+++
9387c2fbfb3SApril Chin	: line 1
9397c2fbfb3SApril Chin
9407c2fbfb3SApril Chin	: line 3
9417c2fbfb3SApril Chin+++
9427c2fbfb3SApril Chin# Print one line in a call stack
9437c2fbfb3SApril Chinfunction _Dbg_print_frame
9447c2fbfb3SApril Chin{
9457c2fbfb3SApril Chin	typeset -i pos=$1
9467c2fbfb3SApril Chin	typeset fn=$2
9477c2fbfb3SApril Chin	typeset filename="$3"
9487c2fbfb3SApril Chin	typeset -i line=$4
9497c2fbfb3SApril Chin	typeset  arg=$5
9507c2fbfb3SApril Chin	shift 5
9517c2fbfb3SApril Chin	if	((pos==0))
9527c2fbfb3SApril Chin	then	[[ $filename == "$basefile" ]] || err_exit "filename for level 0 is $filename not $basename"
9537c2fbfb3SApril Chin		[[ $arg == DEBUG  ]] && ((baseline++))
9547c2fbfb3SApril Chin		[[ $line == "$baseline" ]] || err_exit "line number for level 0 is $line not $baseline"
9557c2fbfb3SApril Chin	elif	((pos==1))
95634f9b3eeSRoland Mainz	then	[[ $filename == "$tmp/debug" ]] ||  err_exit "filename for level 1 is $filename not $tmp/debug"
9577c2fbfb3SApril Chin		[[ $* == 'foo bar' ]] || err_exit "args are '$*', not 'foo bar'"
9587c2fbfb3SApril Chin		[[ $line == $arg ]] || err_exit "line number for level 1 is $line not $arg"
9597c2fbfb3SApril Chin	else	err_exit "level should be 0 or 1 but is $pos"
9607c2fbfb3SApril Chin	fi
9617c2fbfb3SApril Chin}
9627c2fbfb3SApril Chin
9637c2fbfb3SApril Chinfunction _Dbg_debug_trap_handler
9647c2fbfb3SApril Chin{
9657c2fbfb3SApril Chin
9667c2fbfb3SApril Chin	integer .level=.sh.level .max=.sh.level-1
9677c2fbfb3SApril Chin	while((--.level>=0))
9687c2fbfb3SApril Chin	do
9697c2fbfb3SApril Chin		((.sh.level = .level))
9707c2fbfb3SApril Chin      		_Dbg_print_frame  "${.level}" "$0" "${.sh.file}" "${.sh.lineno}" "${.sh.command##* }" "$@"
9717c2fbfb3SApril Chin	done
9727c2fbfb3SApril Chin}
9737c2fbfb3SApril Chin
9747c2fbfb3SApril Chin((baseline=LINENO+2))
9757c2fbfb3SApril Chintrap '_Dbg_debug_trap_handler' DEBUG
97634f9b3eeSRoland Mainz.  $tmp/debug foo bar
9777c2fbfb3SApril Chintrap '' DEBUG
9787c2fbfb3SApril Chin
9797c2fbfb3SApril Chincaller() {
9807c2fbfb3SApril Chin  integer .level=.sh.level .max=.sh.level-1
9817c2fbfb3SApril Chin  while((--.level>=0))
9827c2fbfb3SApril Chin  do
9837c2fbfb3SApril Chin      ((.sh.level = .level))
9847c2fbfb3SApril Chin      print -r -- "${.sh.lineno}"
9857c2fbfb3SApril Chin  done
9867c2fbfb3SApril Chin}
9877c2fbfb3SApril Chinbar() { caller;}
9887c2fbfb3SApril Chinset -- $(bar)
9897c2fbfb3SApril Chin[[ $1 == $2 ]] && err_exit ".sh.inline optimization bug"
9907c2fbfb3SApril Chin( $SHELL  -c ' function foo { typeset x=$1;print $1;};z=();z=($(foo bar)) ') 2> /dev/null ||  err_exit 'using a function to set an array in a command sub  fails'
99134f9b3eeSRoland Mainz
99234f9b3eeSRoland Mainz{
99334f9b3eeSRoland Mainzgot=$(
99434f9b3eeSRoland Mainzs=$(ulimit -s)
99534f9b3eeSRoland Mainzif	[[ $s == +([[:digit:]]) ]] && (( s < 16384 ))
99634f9b3eeSRoland Mainzthen	ulimit -s 16384 2>/dev/null
99734f9b3eeSRoland Mainzfi
99834f9b3eeSRoland Mainz$SHELL << \+++
99934f9b3eeSRoland Mainzf()
100034f9b3eeSRoland Mainz{
100134f9b3eeSRoland Mainz	if	(($1>1))
100234f9b3eeSRoland Mainz	then	x=$(f $(($1-1))) || exit 1
100334f9b3eeSRoland Mainz	fi
100434f9b3eeSRoland Mainz	return 0
100534f9b3eeSRoland Mainz}
100634f9b3eeSRoland Mainzf 257 && print ok
100734f9b3eeSRoland Mainz+++
100834f9b3eeSRoland Mainz)
100934f9b3eeSRoland Mainz} 2>/dev/null
101034f9b3eeSRoland Mainz[[ $got == ok ]] || err_exit 'cannot handle comsub depth > 256 in function'
101134f9b3eeSRoland Mainz
101234f9b3eeSRoland Mainztmp1=$tmp/job.1
101334f9b3eeSRoland Mainztmp2=$tmp/job.2
101434f9b3eeSRoland Mainzcat > $tmp1 << +++
101534f9b3eeSRoland Mainz#! $SHELL
101634f9b3eeSRoland Mainzprint \$\$
101734f9b3eeSRoland Mainz+++
101834f9b3eeSRoland Mainzchmod +x $tmp1
101934f9b3eeSRoland Mainzfunction foo
102034f9b3eeSRoland Mainz{
102134f9b3eeSRoland Mainz	typeset pid
102234f9b3eeSRoland Mainz	$tmp1 > $tmp2 & pid=$!
102334f9b3eeSRoland Mainz	wait $!
102434f9b3eeSRoland Mainz	[[ $(< $tmp2) == $pid ]] || err_exit 'wrong pid for & job in function'
102534f9b3eeSRoland Mainz}
102634f9b3eeSRoland Mainzfoo
102734f9b3eeSRoland Mainz# make sure compiled functions work
102834f9b3eeSRoland Mainz[[ $(tmp=$tmp $SHELL <<- \++++
102934f9b3eeSRoland Mainz	cat > $tmp/functions <<- \EOF
103034f9b3eeSRoland Mainz	 	function bar
103134f9b3eeSRoland Mainz	 	{
103234f9b3eeSRoland Mainz	 		print foo
103334f9b3eeSRoland Mainz	 	}
103434f9b3eeSRoland Mainz	 	function foobar
103534f9b3eeSRoland Mainz	 	{
103634f9b3eeSRoland Mainz	 		bar
103734f9b3eeSRoland Mainz	 	}
103834f9b3eeSRoland Mainz	EOF
103934f9b3eeSRoland Mainz	${SHCOMP:-${SHELL%/*}/shcomp} $tmp/functions > $tmp/foobar
104034f9b3eeSRoland Mainz	rm -f "$tmp/functions"
104134f9b3eeSRoland Mainz	chmod +x $tmp/foobar
104234f9b3eeSRoland Mainz	rm $tmp/!(dir|foobar)
104334f9b3eeSRoland Mainz	FPATH=$tmp
104434f9b3eeSRoland Mainz	PATH=$FPATH:$PATH
104534f9b3eeSRoland Mainz	foobar
104634f9b3eeSRoland Mainz++++
104734f9b3eeSRoland Mainz) == foo ]] > /dev/null  || err_exit 'functions compiled with shcomp not working'
104834f9b3eeSRoland Mainz# test for functions in shell having side effects.
104934f9b3eeSRoland Mainzunset -f foo foobar bar
105034f9b3eeSRoland Mainzcd "$tmp"
105134f9b3eeSRoland MainzFPATH=$PWD
105234f9b3eeSRoland MainzPATH=$FPATH:$PATH
105334f9b3eeSRoland Mainzcat > foo <<- \EOF
105434f9b3eeSRoland Mainz	function bar
105534f9b3eeSRoland Mainz	{
105634f9b3eeSRoland Mainz		print foobar
105734f9b3eeSRoland Mainz	}
105834f9b3eeSRoland Mainz	function foo
105934f9b3eeSRoland Mainz	{
106034f9b3eeSRoland Mainz		bar
106134f9b3eeSRoland Mainz	}
106234f9b3eeSRoland MainzEOF
106334f9b3eeSRoland Mainzchmod +x foo
106434f9b3eeSRoland Mainz: $(foo)
106534f9b3eeSRoland Mainz[[ $(typeset +f) == *foo* ]] &&  err_exit 'function in subshell leaving side effect of function foo'
106634f9b3eeSRoland Mainzunset -f foo bar
106734f9b3eeSRoland Mainz:  $(foo)
106834f9b3eeSRoland Mainz[[ $(typeset +f) == *foo* ]] && err_exit 'function in subshell leaving side effects of function foo after reload'
106934f9b3eeSRoland Mainz[[ $(typeset +f) == *bar* ]] && err_exit 'function in subshell leaving side effects of function bar after reload'
107034f9b3eeSRoland Mainz
1071*3e14f97fSRoger A. Faulknerunset -f foo
1072*3e14f97fSRoger A. Faulknertypeset -A bar
1073*3e14f97fSRoger A. Faulknerfunction foo
1074*3e14f97fSRoger A. Faulkner{
1075*3e14f97fSRoger A. Faulkner	typeset -i bar[$1].x
1076*3e14f97fSRoger A. Faulkner	bar[$1].x=5
1077*3e14f97fSRoger A. Faulkner}
1078*3e14f97fSRoger A. Faulknerfoo sub
1079*3e14f97fSRoger A. Faulkner[[ ${!bar[@]} == sub ]] || err_exit 'scoping problem with compound array variables'
1080*3e14f97fSRoger A. Faulkner
1081*3e14f97fSRoger A. Faulknerfunction A
1082*3e14f97fSRoger A. Faulkner{
1083*3e14f97fSRoger A. Faulkner        trap "> /dev/null;print TRAP A" EXIT
1084*3e14f97fSRoger A. Faulkner	# (( stderr )) && print >&2
1085*3e14f97fSRoger A. Faulkner}
1086*3e14f97fSRoger A. Faulkner
1087*3e14f97fSRoger A. Faulknerfunction B
1088*3e14f97fSRoger A. Faulkner{
1089*3e14f97fSRoger A. Faulkner        trap "> /dev/null;print TRAP B" EXIT
1090*3e14f97fSRoger A. Faulkner        A
1091*3e14f97fSRoger A. Faulkner}
1092*3e14f97fSRoger A. Faulkner
1093*3e14f97fSRoger A. Faulknerx=$(B)
1094*3e14f97fSRoger A. Faulkner[[ $x == $'TRAP A\nTRAP B' ]] || err_exit "trap from funtions in subshells fails got" $x
1095*3e14f97fSRoger A. Faulkner
1096da2e3ebdSchinexit $((Errors))
1097