diff --git a/Mac/scripts/EditPythonPrefs.py b/Mac/scripts/EditPythonPrefs.py
index bc7e2da..d45a612 100644
--- a/Mac/scripts/EditPythonPrefs.py
+++ b/Mac/scripts/EditPythonPrefs.py
@@ -13,9 +13,8 @@
 import os
 import sys
 import Res # For Res.Error
-
-# Resource in the Python resource chain
-PREFNAME_NAME="PythonPreferenceFileName"
+import pythonprefs
+import EasyDialogs
 
 # resource IDs in our own resources (dialogs, etc)
 MESSAGE_ID = 256
@@ -31,88 +30,46 @@
 # The options dialog. There is a correspondence between
 # the dialog item numbers and the option.
 OPT_DIALOG_ID = 510
-# 1 thru 9 are the options
+
+# Map dialog item numbers to option names (and the reverse)
+opt_dialog_map = [
+	None,
+	"inspect",
+	"verbose",
+	"optimize",
+	"unbuffered",
+	"debugging",
+	"keepopen",
+	"keeperror",
+	"nointopt",
+	"noargs",
+	"delayconsole"]
+opt_dialog_dict = {}
+for i in range(len(opt_dialog_map)):
+	if opt_dialog_map[i]:
+		opt_dialog_dict[opt_dialog_map[i]] = i
+# 1 thru 10 are the options
 # The GUSI creator/type and delay-console
-OD_CREATOR_ITEM = 10
-OD_TYPE_ITEM = 11
-OD_DELAYCONSOLE_ITEM = 12
+OD_CREATOR_ITEM = 11
+OD_TYPE_ITEM = 12
 OD_OK_ITEM = 13
 OD_CANCEL_ITEM = 14
 
-# Resource IDs in the preferences file
-PATH_STRINGS_ID = 128
-DIRECTORY_ID = 128
-OPTIONS_ID = 128
-GUSI_ID = 10240
-
-# Override IDs (in the applet)
-OVERRIDE_PATH_STRINGS_ID = 129
-OVERRIDE_DIRECTORY_ID = 129
-OVERRIDE_OPTIONS_ID = 129
-OVERRIDE_GUSI_ID = 10241
-
-# Things we know about the GUSI resource. Note the code knows these too.
-GUSIPOS_TYPE=0
-GUSIPOS_CREATOR=4
-GUSIPOS_SKIP=8
-GUSIPOS_FLAGS=9
-GUSIPOS_VERSION=10
-GUSIVERSION='0181'
-GUSIFLAGS_DELAY=0x20 # Mask
-
-READ = 1
-WRITE = 2
-smAllScripts = -3
-kOnSystemDisk = 0x8000
-
-def restolist(data):
-	"""Convert STR# resource data to a list of strings"""
-	if not data:
-		return []
-	num, = struct.unpack('h', data[:2])
-	data = data[2:]
-	rv = []
-	for i in range(num):
-		strlen = ord(data[0])
-		if strlen < 0: strlen = strlen + 256
-		str = data[1:strlen+1]
-		data = data[strlen+1:]
-		rv.append(str)
-	return rv
-	
-def listtores(list):
-	"""Convert a list of strings to STR# resource data"""
-	rv = struct.pack('h', len(list))
-	for str in list:
-		rv = rv + chr(len(str)) + str
-	return rv
-
-def message(str = "Hello, world!", id = MESSAGE_ID):
-	"""Show a simple alert with a text message"""
-	d = GetNewDialog(id, -1)
-	d.SetDialogDefaultItem(1)
-	tp, h, rect = d.GetDialogItem(2)
-	SetDialogItemText(h, str)
-	while 1:
-		n = ModalDialog(None)
-		if n == 1: break
-		
-def optinteract((options, creator, type, delaycons)):
+def optinteract(options):
 	"""Let the user interact with the options dialog"""
-	old_options = (options[:], creator, type, delaycons)
 	d = GetNewDialog(OPT_DIALOG_ID, -1)
 	tp, h, rect = d.GetDialogItem(OD_CREATOR_ITEM)
-	SetDialogItemText(h, creator)
+	SetDialogItemText(h, options['creator'])
 	tp, h, rect = d.GetDialogItem(OD_TYPE_ITEM)
-	SetDialogItemText(h, type)
+	SetDialogItemText(h, options['type'])
 	d.SetDialogDefaultItem(OD_OK_ITEM)
 	d.SetDialogCancelItem(OD_CANCEL_ITEM)
+	
 	while 1:
-		for i in range(len(options)):
-			tp, h, rect = d.GetDialogItem(i+1)
-			h.as_Control().SetControlValue(options[i])
-		tp, h, rect = d.GetDialogItem(OD_DELAYCONSOLE_ITEM)
-		h.as_Control().SetControlValue(delaycons)
+		for name in opt_dialog_dict.keys():
+			num = opt_dialog_dict[name]
+			tp, h, rect = d.GetDialogItem(num)
+			h.as_Control().SetControlValue(options[name])
 		n = ModalDialog(None)
 		if n == OD_OK_ITEM:
 			tp, h, rect = d.GetDialogItem(OD_CREATOR_ITEM)
@@ -120,25 +77,24 @@
 			tp, h, rect = d.GetDialogItem(OD_TYPE_ITEM)
 			ntype = GetDialogItemText(h)
 			if len(ncreator) == 4 and len(ntype) == 4:
-				return options, ncreator, ntype, delaycons
+				options['creator'] = ncreator
+				options['type'] = ntype
+				return options
 			else:
-				sys.stderr.write('\007')
+				MacOS.SysBeep()
 		elif n == OD_CANCEL_ITEM:
-			return old_options
+			return
 		elif n in (OD_CREATOR_ITEM, OD_TYPE_ITEM):
 			pass
-		elif n == OD_DELAYCONSOLE_ITEM:
-			delaycons = (not delaycons)
-		elif 1 <= n <= len(options):
-			options[n-1] = (not options[n-1])
+		elif 1 <= n <= len(opt_dialog_map):
+			options[opt_dialog_map[n]] = (not options[opt_dialog_map[n]])
 
 			
-def interact(list, pythondir, options, title):
+def interact(options, title):
 	"""Let the user interact with the dialog"""
-	opythondir = pythondir
 	try:
 		# Try to go to the "correct" dir for GetDirectory
-		os.chdir(pythondir.as_pathname())
+		os.chdir(options['dir'].as_pathname())
 	except os.error:
 		pass
 	d = GetNewDialog(DIALOG_ID, -1)
@@ -146,7 +102,7 @@
 	SetDialogItemText(h, title)
 	tp, h, rect = d.GetDialogItem(TEXT_ITEM)
 ##	SetDialogItemText(h, string.joinfields(list, '\r'))
-	h.data = string.joinfields(list, '\r')
+	h.data = string.joinfields(options['path'], '\r')
 	d.SelectDialogItemText(TEXT_ITEM, 0, 32767)
 	d.SelectDialogItemText(TEXT_ITEM, 0, 0)
 ##	d.SetDialogDefaultItem(OK_ITEM)
@@ -164,272 +120,34 @@
 		if n == DIR_ITEM:
 			fss, ok = macfs.GetDirectory('Select python home folder:')
 			if ok:
-				pythondir = fss
+				options['dir'] = fss
 		if n == OPTIONS_ITEM:
-			options = optinteract(options)
+			noptions = options
+			for k in options.keys():
+				noptions[k] = options[k]
+			noptions = optinteract(noptions)
+			if noptions:
+				options = noptions
 	tmp = string.splitfields(h.data, '\r')
-	rv = []
+	newpath = []
 	for i in tmp:
 		if i:
-			rv.append(i)
-	return rv, pythondir, options
+			newpath.append(i)
+	options['path'] = newpath
+	return options
 	
-def getprefpath(id):
-	# Load the path and directory resources
-	try:
-		sr = GetResource('STR#', id)
-	except (MacOS.Error, Res.Error):
-		return None, None
-	d = sr.data
-	l = restolist(d)
-	return l, sr
-
-def getprefdir(id):
-	try:
-		dr = GetResource('alis', id)
-		fss, fss_changed = macfs.RawAlias(dr.data).Resolve()
-	except (MacOS.Error, Res.Error):
-		return None, None, 1
-	return fss, dr, fss_changed
-
-def getoptions(id):
-	try:
-		opr = GetResource('Popt', id)
-	except (MacOS.Error, Res.Error):
-		return [0]*9, None
-	options = map(lambda x: ord(x), opr.data)
-	while len(options) < 9:
-		options = options + [0]
-	return options, opr
-	
-def getgusioptions(id):
-	try:
-		opr = GetResource('GU\267I', id)
-	except (MacOS.Error, Res.Error):
-		return '????', '????', 0, None
-	data = opr.data
-	type = data[GUSIPOS_TYPE:GUSIPOS_TYPE+4]
-	creator = data[GUSIPOS_CREATOR:GUSIPOS_CREATOR+4]
-	flags = ord(data[GUSIPOS_FLAGS])
-	version = data[GUSIPOS_VERSION:GUSIPOS_VERSION+4]
-	if version <> GUSIVERSION:
-		message('GU\267I resource version "%s", fixing to "%s"'%(version, GUSIVERSION))
-		flags = 0
-	delay = (not not (flags & GUSIFLAGS_DELAY))
-	return creator, type, delay, opr
-	
-def setgusioptions(opr, creator, type, delay):
-	data = opr.data
-	flags = ord(data[GUSIPOS_FLAGS])
-	version = data[GUSIPOS_VERSION:GUSIPOS_VERSION+4]
-	if version <> GUSIVERSION:
-		flags = 0x88
-		version = GUSIVERSION
-	if delay:
-		flags = flags | GUSIFLAGS_DELAY
-	else:
-		flags = flags & ~GUSIFLAGS_DELAY
-	data = type + creator + data[GUSIPOS_SKIP] + chr(flags) + GUSIVERSION + data[GUSIPOS_VERSION+4:]
-	return data
-	
-def openpreffile(rw):
-	# Find the preferences folder and our prefs file, create if needed.	
-	vrefnum, dirid = macfs.FindFolder(kOnSystemDisk, 'pref', 0)
-	try:
-		pnhandle = GetNamedResource('STR ', PREFNAME_NAME)
-	except Res.Error:
-		message("No %s resource (old Python?)"%PREFNAME_NAME)
-		sys.exit(1)
-	prefname = pnhandle.data[1:]
-	preff_fss = macfs.FSSpec((vrefnum, dirid, prefname))
-	try:
-		preff_handle = FSpOpenResFile(preff_fss, rw)
-	except Res.Error:
-		# Create it
-		message('No preferences file, creating one...')
-		FSpCreateResFile(preff_fss, 'Pyth', 'pref', smAllScripts)
-		preff_handle = FSpOpenResFile(preff_fss, rw)
-	return preff_handle
-	
-def openapplet(name):
-	fss = macfs.FSSpec(name)
-	try:
-		app_handle = FSpOpenResFile(fss, WRITE)
-	except Res.Error:
-		message('File does not have a resource fork.')
-		sys.exit(0)
-	return app_handle
-		
 	
 def edit_preferences():
-	preff_handle = openpreffile(WRITE)
-	
-	l, sr = getprefpath(PATH_STRINGS_ID)
-	if l == None:	
-		message('Cannot find any sys.path resource! (Old python?)')
-		sys.exit(0)
-		
-	fss, dr, fss_changed = getprefdir(DIRECTORY_ID)
-	if fss == None:
-		fss = macfs.FSSpec(os.getcwd())
-		fss_changed = 1
-		
-	options, opr = getoptions(OPTIONS_ID)
-	saved_options = options[:]
-	
-	creator, type, delaycons, gusi_opr = getgusioptions(GUSI_ID)
-	saved_gusi_options = creator, type, delaycons
-	
-	# Let the user play away
-	result = interact(l, fss, (options, creator, type, delaycons),
-			 'System-wide preferences')
-	
-	# See what we have to update, and how
-	if result == None:
-		sys.exit(0)
-		
-	pathlist, nfss, (options, creator, type, delaycons) = result
-	if nfss != fss:
-		fss_changed = 1
-		
-	if fss_changed:
-		alias = nfss.NewAlias()
-		if dr:
-			dr.data = alias.data
-			dr.ChangedResource()
-		else:
-			dr = Resource(alias.data)
-			dr.AddResource('alis', DIRECTORY_ID, '')
-			
-	if pathlist != l:
-		if pathlist == []:
-			if sr.HomeResFile() == preff_handle:
-				sr.RemoveResource()
-		elif sr.HomeResFile() == preff_handle:
-			sr.data = listtores(pathlist)
-			sr.ChangedResource()
-		else:
-			sr = Resource(listtores(pathlist))
-			sr.AddResource('STR#', PATH_STRINGS_ID, '')
-			
-	if options != saved_options:
-		newdata = reduce(lambda x, y: x+chr(y), options, '')
-		if opr and opr.HomeResFile() == preff_handle:
-			opr.data = newdata
-			opr.ChangedResource()
-		else:
-			opr = Resource(newdata)
-			opr.AddResource('Popt', OPTIONS_ID, '')
-			
-	if (creator, type, delaycons) != saved_gusi_options:
-		newdata = setgusioptions(gusi_opr, creator, type, delaycons)
-		if gusi_opr.HomeResFile() == preff_handle:
-			gusi_opr.data = newdata
-			gusi_opr.ChangedResource()
-		else:
-			ngusi_opr = Resource(newdata)
-			ngusi_opr.AddResource('GU\267I', GUSI_ID, '')
-				
-	CloseResFile(preff_handle)
+	handler = pythonprefs.PythonOptions()
+	result = interact(handler.load(), 'System-wide preferences')
+	if result:
+		handler.save(result)
 	
 def edit_applet(name):
-	pref_handle = openpreffile(READ)
-	app_handle = openapplet(name)
-	
-	notfound = ''
-	l, sr = getprefpath(OVERRIDE_PATH_STRINGS_ID)
-	if l == None:
-		notfound = 'path'
-		
-		l, dummy = getprefpath(PATH_STRINGS_ID)
-		if l == None:	
-			message('Cannot find any sys.path resource! (Old python?)')
-			sys.exit(0)
-		
-	fss, dr, fss_changed = getprefdir(OVERRIDE_DIRECTORY_ID)
-	if fss == None:
-		if notfound:
-			notfound = notfound + ', directory'
-		else:
-			notfound = 'directory'
-		fss, dummy, dummy2 = getprefdir(DIRECTORY_ID)
-		if fss == None:
-			fss = macfs.FSSpec(os.getcwd())
-			fss_changed = 1
-
-	options, opr = getoptions(OVERRIDE_OPTIONS_ID)
-	if not opr:
-		if notfound:
-			notfound = notfound + ', options'
-		else:
-			notfound = 'options'
-		options, dummy = getoptions(OPTIONS_ID)
-	saved_options = options[:]
-	
-	creator, type, delaycons, gusi_opr = getgusioptions(OVERRIDE_GUSI_ID)
-	if not gusi_opr:
-		if notfound:
-			notfound = notfound + ', GUSI options'
-		else:
-			notfound = 'GUSI options'
-		creator, type, delaycons, gusi_opr = getgusioptions(GUSI_ID)
-	saved_gusi_options = creator, type, delaycons
-	
-	dummy = dummy2 = None # Discard them.
-	
-	if notfound:
-		message('Warning: initial %s taken from system-wide defaults'%notfound)
-	# Let the user play away
-	result = interact(l, fss, (options, creator, type, delaycons), name)
-	
-	# See what we have to update, and how
-	if result == None:
-		sys.exit(0)
-		
-	pathlist, nfss, (options, creator, type, delaycons) = result
-	if nfss != fss:
-		fss_changed = 1
-		
-	if fss_changed:
-		alias = nfss.NewAlias()
-		if dr:
-			dr.data = alias.data
-			dr.ChangedResource()
-		else:
-			dr = Resource(alias.data)
-			dr.AddResource('alis', OVERRIDE_DIRECTORY_ID, '')
-			
-	if pathlist != l:
-		if pathlist == []:
-			if sr.HomeResFile() == app_handle:
-				sr.RemoveResource()
-		elif sr and sr.HomeResFile() == app_handle:
-			sr.data = listtores(pathlist)
-			sr.ChangedResource()
-		else:
-			sr = Resource(listtores(pathlist))
-			sr.AddResource('STR#', OVERRIDE_PATH_STRINGS_ID, '')
-			
-	if options != saved_options:
-		newdata = reduce(lambda x, y: x+chr(y), options, '')
-		if opr and opr.HomeResFile() == app_handle:
-			opr.data = newdata
-			opr.ChangedResource()
-		else:
-			opr = Resource(newdata)
-			opr.AddResource('Popt', OVERRIDE_OPTIONS_ID, '')
-			
-	if (creator, type, delaycons) != saved_gusi_options:
-		newdata = setgusioptions(gusi_opr, creator, type, delaycons)
-		id, type, name = gusi_opr.GetResInfo()
-		if gusi_opr.HomeResFile() == app_handle and id == OVERRIDE_GUSI_ID:
-			gusi_opr.data = newdata
-			gusi_opr.ChangedResource()
-		else:
-			ngusi_opr = Resource(newdata)
-			ngusi_opr.AddResource('GU\267I', OVERRIDE_GUSI_ID, '')
-			
-	CloseResFile(app_handle)
+	handler = pythonprefs.AppletOptions(name)
+	result = interact(handler.load(), os.path.split(name)[1])
+	if result:
+		handler.save(result)
 
 def main():
 	try:
diff --git a/Mac/scripts/EditPythonPrefs.rsrc.hqx b/Mac/scripts/EditPythonPrefs.rsrc.hqx
index 259b6ba..dcb65d6 100644
--- a/Mac/scripts/EditPythonPrefs.rsrc.hqx
+++ b/Mac/scripts/EditPythonPrefs.rsrc.hqx
@@ -1,64 +1,65 @@
 (This file must be converted with BinHex 4.0)
 
-:&%9NDA43HA4SEfj3FQ9QFbjbFh*M!(*cFQ058d9%!3#3"`m+@DJ!N!3"!!!!$FN
-!!!c*!!!"36B8)&3JD!!8)&"p%E"S%3!k!@FQ%Lm-6VS#$!`k!&Tj&%9NDA43HA4
-SEfj3FQ9QFbjbFh*MF`)!!!!rN!B!!$q3#!#3',!EP68!N!B2#[m4`+KT!4e!%Ir
-c%h!!%#lrmlh5%@B386Dq9@X"!8*%[D'q9@X"!6"4-J&R(N39$!!!('85F!!3,N-
-9$!!!(f)'F!&J!!%"!LaD9#dZ4,d"!"Xm!@B`*e8q'NU!)&-#+!#r!#iL!1d*!J%
-!3)-Sfc36UGF[$%kk!3P+CfX"!+CA3cS!!!%!!!%!!!!#J!!!"%!!!!JJ!!!3%!!
-!)BJ!!%'%!!#$`J!"!m%!!JIiJ!3(K%!)"!)J%!MK%#!6))K!(L"mJ!2J1N!-!$N
-J%`!k%"$J2!J-(MJ%!!(i!J`!1!%5!%!!N[L!!%`"!!!J!J!!%!3!!!J)!!!%%!!
-!!L!!!!&!!!!!J!!!!3!!!!1!!!!(`!!!$q!!!"r`!!!rq!!!Ir`!!2rq!!(rr`!
-$rrq!"rrr`!rrrq!Irrr`2rrrq(rrrrcrrrrqIrrrrcrrrriIrrrm$rrrq!IrrrJ
-$rrri!Irr`!$rri!!Irm!!$rq!!!Ir!!!$rJ!!!I`!!!$i!!!!F!!!!#!!*!%#P$
-J!"k%J!!(S5!!!!!(39"36!#3"N!"!!+!"%!,B"13!#))455#id%$)--62`X,""!
-#)!&!!)!"!!1!"m!2i"r`2rKrr2rrIrmrrarr$rX(m!2J!F!!J!!!"!#3%2m!N"l
-r!2m!N"cr!!!!r`#3'[m!!2Ae!2m!N"Mr!!$eN!3!r`#3&[m!!2AeX,$ep3$r!*!
-8r`!!pIAeX,$epI8!r`#3%[m!!2AepE#3"2Aep3$r!*!3r`!!pC!%X*!%pC!%!2m
-!N!lr!!$eN!5`N!6rN!6ep3$r!*!-r`!!pC!&X2rrr`L3"2rep3$r!*!+r`!!pC!
-'rc-)N!IrpI8!r`#3#2m!!2@3"[m)#$2rrrm)N!6rpI8!r`#3"[m!!2@3"[m)-rr
-rprIr#*!&rrAe!2m!N!6r!!$eN!IrN!6hpIAr-`L3"Iq3"3!!r`!!pC!,rj!&!3L
-3"62rrrrhr`!!rrIeN!Rrrc-)N!ScrrrrprIr!!$rpr@3"rm&prrr-c-c#*!'-rr
-rrrIr!*!%rrIeN!Er"3Ahprrrrc13"!J)-rq3"!#3"[rhpC!'rrrepIIhprq3"$-
-c-rrrr`#3#2rhpC!-pj!%rj!'!*!*rrIeN!6rrr@3#2H3"2rrr`#3#[rhpIArpIA
-rpC!)prIr!*!1rrIerrAerrArN!AeprIr!*!3rrIerrreN!Ihprm!N",rpr@3#2I
-hr`#3&2rhpC!'prIr!*!@rrIeN!6hprm!N"MrprAeprIr!*!DrrIhprm!N"crprm
-!N"lr!*!4!3#3#2m!N!lrpIm!N!crpIAer`#3#[reX,$errm!N!MrpI@`rrm)#2m
-!N!ErpIAer`L3"Im!N!6rpIAer`Mr#!Mr#!Mr!!$rpC!&rrIrrrm)#$2rr`$rpC!
-'rc-c#$-crrm!!2reN!Arrc13"2rr!!!!rrAerrrepIq3"J#3"2rerrrepIAhr`$
-rr`#3"IreN!6hr`#3#[repIIr!*!-rrIr!*!1r`#3#S!!!!!2!*!(m2!!N!82!!m
-!N!A`93r`!!!!$`"Im!m!!!$`!2!!!2!!$`!2c`$`$`$`!!$mrr!0r`m!!!$pd0h
-r!2!!!2rGhIm!$`$r!2rrr`!!m2m!$2$r!!!2!!$2!*!&m!c`!*!&$mm!N!I`!*!
-&!J#3#!m!N!r`m!#3$3m!$`#3$I!!!2!!N!X2!!!!$`#3#r!!"9!!m!#3#3m!!!9
-3!!m!N!R`!!"993!!m!#3"`m!!!"993!!$`#3"r!!!!99Arr`!2!!N!82!!!!"Ir
-`!!m!$`#3"I!!!!!2d!!!!2!!m!!!!!m!N!6mcIr`!!m!$`!!!2!!!!!2cIr-m!!
-!m!$`!!m!N!32rr`!m!!!$rrr!2!!N!Errr!!!!hrr2!2`!#3"2r3!*!%$Irmc`$
-m!!!!$acrhG!!!!hrr2!!$m!!!!m4c2rphG!0rrm!!!$m!!!!r`$-crrphIr`!!!
-!$m!!N!8-c-rrrr!!N!6m!!$r!*!%c-crm!#3"!r!$`$`!!!!$-m!N!Im$`$`rrr
-`c2!!N!F2`2m!!!!-c`#3#I`!N!6-m!#3#3r!!!!-c`#3#r`!!-c`!*!,$m!-c`#
-3$Ic-m!#3$3r2!*!2m!#3#K8!)J"S!B!"R`!"!!!"!*!&!Im!N!3"!*!%"bU3"!!
-"!*!%*&"jG$!!!!!"4P*&4J!"!!!!J!!"!)&*3diM!!%!!!%X!!%!N!3"#J!'!*!
-&8J!9!2-"*a!*4@4TG#"8CAKdK`#3"!%l!2!"6`%X"!*25`#3"!%l!"3"6`"1"!C
-$B@jMC@`!N!Ak!"3"$!%V""p6C@aPBh3J*#K3@94)6diT)'K[E@8JCQpXC'9b,Li
-ZCJ#3"3d!&`!H!5B)#89NDA3J9'9iG#i!N!8U!"8!6J%RL%p&ER4PFL"cHA-ZF'&
-dD#"MEfe`EfjPER4c,#"[EQ8JF'9b)'aTEQ80+&9cC5!N+&"C9%K26LNJCQpb)("
-jG'K[EL"SEfeP)'C[E'4PFLNk!*!&!4-!&!%P!5X%'N4PCQ&eE(3JFh4KFR4eF#"
-[F(4TEfjc,LiZ!!!!&3!X!&B"CJ&T!!%"!!%!N!8"rJ!!!!*F!"%!N!8H!!N!-!%
-1"50&ER4PFL"TER4PFQ&MG'PfC5"YEf4P)'&QG'9b)(0MFQP`G#-!N!8c!!N!43%
-1"4G8FQ&MC5"TEA"[FR3JFh4KG'9YC@jdFi)!N!9*!!N!@`%0"4a6GA"`FQ9cFb"
-PH("bCA0cD@pZ)("bD@jdD@jR!*!&A`!*!(%"$!8B9@jLG@CQCA*PC#"cG'4[GA3
-[Fh4NCA*b!*!&G3!*!)F"#`864'9LG@FJF'&bFf9b)'peG("eG'8!N!@J!"i!XJ#
--"3Y1Eh*YB@`JCAKTG(-!N!@J!+!!XJ%+"3TPFR*[FL"PH'Pd!*!&i3!+!2-"$!8
-L4'PcB@*XC5"TER4PFQ&MG'PfC5"[F(4TEfiYFf9dG'PZC`#3"I8!#J%'!3X&'d4
-TFf&LE'8JBA*RBbpKFQGf)'9YG@aKG'P[EQF!N!@i!+!!b!$V%!#3"X`!S!$F!1X
-3!*!&!3J!#J%D!3X&)84PE'&j)'0[ER0[E'8JGfPZC'ph)(9ZG'PX)'jPC@4PC!#
-3"3%I!08"-`%2"!*25`#3"!%I!!S"-`"("!C$B@jMC@`!N!8'!#B!&`$ZL"T3HA4
-SEfiJD@jdCA*`FQ9dCA)JEh"dD@pZF`#3"B`!#J#F!3Z)'NYPCA!JFh4ND@mJGfP
-ZC'ph)'p`C@iJEfik!*!&Z!!+!-N!PiJ94'9QBA9XG#"QD@aP)'0bC@&dEh)kC3#
-3"F`!#J$G!*H)%N4PCQ&eE(3JCQPXC5"dHA"P1J!!!3!!!!h*!!!-b3!!!8%$@l4
-),HJ!!!!F!6)!#d*14%`!!!"L5801)`!!!'j659T&!!!!HNC548B!!3#'D@0c)`!
-!!*jTBf`i!!!!UQPMFcJ!!!#fD@0c0!!!!-*TBf`d!!!!cN4-6dF!!3$D4%P86!!
-"!2*3HA3`!!!"#J#!rrm!!!ND!*!%!5crr`#3#2q3"!!!!33!N!@!rrm!!!%5!*!
-&JIrr!!!*$`#3"!%Xrrm!!!%G!*!%!5crr`!!!@%!N!3",2rr!!!&C3#3"!%Xrrm
-!!!CT!*!%!5crr`!!"Zd!N!3"rrrr!!!)m3#3"!(qrrm!!!T3!*!%!Irrr`!!#8)
-$@lF-!Ilrr`!!#QN$@lF%!*!'#3S!N!316hGZCA)JFQ9cEh9bBf9kD`:
+:&%9NDA43HA4SEfj3FQ9QFbjbFh*M!(*cFQ058d9%!3#3"`m!q1)!N!3"!!!!$Em
+!!!br!!!"36B8)&3JD!!8)&"p%E"S%3!k!@FQ%Lm-6VS#$!`k!&Tj&%9NDA43HA4
+SEfj3FQ9QFbjbFh*MC3)!!!"bFh*M8P-!!(*cFQ058d9%!3!!J!%"!*!2!6`"X"Z
+903#3"Jm+ra(!U'N"(8!4rr-6F!!3,[rc[G)4CK"40Vj9D`%"3N5pSEj9D`%"-&%
+b!@FH4"8-!!!FC4*`!"!Z3a8-!!!IBJC`!@!!!3%#,&T8,5j%[3%!'c`"CM!R96i
+D5S!J8`)S!,m!,L)!l3N#!3"!JbME0"1Tebm-6VS"#8TRD`%!TPG$1J!!!3!!!3!
+!!!+!!!!%3!!!##!!!"!3!!!KL!!!3B3!!)2#!!%$`3!#"rL!"!H%3!J%!L!3#1%
+3)"-JL%!H)(b!!q!k3!`!15!6!$S3%1!m#!`H1!3!!IJ#$!!i!4)!3!#5q)!!6!%
+!!#!#!!!3"!!!#!J!!!33!!!#)!!!!8!!!!#!!!!"!!!!!i!!!!I!!!!2i!!!(r!
+!!$ri!!"rr!!!rri!!Irr!!2rri!(rrr!$rrri"rrrr!rrrriIrrrr2rrrrjrrrr
+r2rrrrKrrrr`2rrri"rrrq!2rrrJ"rrr!!2rrJ!"rr`!!2ri!!"rm!!!2q!!!"r!
+!!!2J!!!"`!!!!)!!N!3+81!!(S5!!!HK)!!!!!G"8&"-!*!'3!%!!S!%3!YJ%j!
+!)JK&*),M33-J`a-r#`X%%!)J!8!!J!%!!i!(`!rJ(r!rq(rmrrprrcrr(rm2q`I
+`!q!"`!#!!!!%!*!3r`#3([m!r`#3(2m!!!$r!*!Dr`!!pI8!r`#3'2m!!2@3"!$
+r!*!@r`!!pI@`X2Ae!2m!N"6r!!$epI@`X2Aep3$r!*!5r`!!pIAeX*!%pIAe!2m
+!N"$r!!$eN!5`N!6eN!3!r`#3$[m!!2@3",#3"2q3"2Ae!2m!N!cr!!$eN!@`rrr
+r#*!%rrAe!2m!N!Vr!!$eN!Er-`L3"rrep3$r!*!)r`!!pC!'r`J)-rrrr`L3"2r
+ep3$r!*!'r`!!pC!'r`Jcrrrhprm)N!ArpI8!r`#3"2m!!2@3"rq3"2IepImc#*!
+&rj!&!!$r!!$eN![rN!8"#*!&-rrrrrIr!!$rpr@3#Irr-`L3#M2rrrrhprm!!2r
+hpC!(r`Ahrrmc-c-)N!Bcrrrrprm!N!6rpr@3"[m&"IIhrrrr-j!%#!Jcrj!%!*!
+'rrIeN!ErrrAeprIhrj!%-c-crrrr!*!)rrIeN!chN!6rN!B!N!Rrpr@3"2rrpC!
+)pj!%rrrr!*!+rrIepIrepIreN!Mhprm!N!lrprArpIArpIq3"IAhprm!N"$rprA
+rrr@3"rIhr`#3%[rhpC!)prIr!*!8rrIeN!Ehprm!N"Erpr@3"2Ihr`#3'2rhpIA
+hprm!N"VrprIhr`#3(2rhr`#3([m!N"%"!*!)r`#3$[rer`#3$2repIAr!*!+rr@
+`X2Arr`#3#2repE$rr`J)r`#3"[repIAr#*!&r`#3"2repIAr#2m)#2m)#2m!!2r
+eN!Arprrrr`J)-rrr!2reN!Er-c-)-c2rr`!!rr@3"Irr-j!%rrm!!!$rpIArrrA
+erj!'!*!%rrArrrAepIIr!2rr!*!&rr@3"2Ir!*!+rrAeprm!N!crprm!N!lr!*!
++J!!!!!m!N!I`m!#3"3m!$`#3"I"9$r!!!!!2!&r`$`!!!2!!m!!!m!!2!!r2!2!
+2!2!!!2crm!hr$`!!!2h3hIm!m!!!rphGr`!2!2m!rrrr!!$`r`!-m2m!!!m!!-m
+!N!A`$2!!N!82c`#3"r!!N!8#!*!)$`#3$r$`!*!0$`!2!*!0m!!!m!#3#`m!!!!
+2!*!,m!!&8!$`!*!*$`!!"9!!$`#3#I!!!&99!!$`!*!($`!!!&99!!!2!*!(m!!
+!"99Irr!!m!#3"3m!!!!&rr!!$`!2!*!&m!!!!!r3!!!!m!$`!!!!$`#3"2c0rr!
+!$`!2!!!!m!!!!!r0rmc`!!$`!2!!$`#3"!rrr!$`!!!2rrm!m!#3"[rrm!!!$Ir
+mm!r!!*!%rp!!N!30rrc2!2`!!!!2(2rGd!!!$Irmm!!2`!!!$a(-rrhGd!hrr`!
+!!2`!!!$r!-c2rrhGrr!!!!!2`!#3"3c-crrrm!#3"2`!!2m!N!6-c2r`!*!%$m!
+2!2!!!!!-c`#3"r`2!2$rrr$-m!#3"`r!r`!!!!c2!*!*r!#3"-c`!*!*$m!!!!c
+2!*!,r!!!c2!!N!X2`!c2!*!0r-c`!*!0$mm!N!r`!*!+&3!L!'J"J!'I!!%!!!%
+!N!8"r`#3"!%!N!3(+T!%!!%!N!3N8(Pd-!!!!!&'8N9'!!%!!!#!!!%!J8P$6L-
+!!3!!!5`!!3#3"!%+!!B!N!95!"8!m`%R%!P&C'Pd)&4PH(5(!*!%!6X!m!&2!5`
+%!Np,!*!%!6X!&!&2!%i%"N0KEQ0PE!#3"IS!&!%-!5X%(e0PE'9MG#!N+&"C9%K
+26LNJD'pYC5"QEfaNCA)Z,LjQ!*!&$3!A!"i"*JJ*4@4TG#"8CAKd,J#3"5S!&3"
+1!5H)6d9ZG'9b)(0jFbj`BA4S)'0[EA"[EQ9ZG(-X)'pZC5"`CA)JE'PZC3dS9A0
+P)#3S8&P85%p1+5"QEh)JF(PdD'pZ)'K[E@8JCQpXC'9b+6S!N!8"%`!8!58"+`3
+D4'9QBA9XG#"cG'&bG(9`)'p`G'P[ER-Z,Li!!!!9!#`!9J&Q!@N!!3%!!3#3"3(
+q!!!!!P)!%3#3"4i!#3!`!3i&)d9ZG'9b)'PZG'9bB@0dDACP)'e[C'8JB@CdCA)
+JFf0bDA"d)`#3"6-!#3"&!3i&&e4bB@0P)'PYF'pbG#"cG'&dC@ePER4cJJ#3"8N
+!#3"E!3d&%8p`G'PYDATP)'*jG'9MEf4P!*!'A`!*!(%"$!8B9@jLG@CQCA*PC#"
+cG'4[GA3[Fh4NCA*b!*!&G3!*!)F"#`864'9LG@FJF'&bFf9b)'peG("eG'8!N!@
+J!"i!XJ#-"3Y1Eh*YB@`JCAKTG(-!N!@J!+!!XJ%+"3TPFR*[FL"PH'Pd!*!&i3!
++!2-"$!8L4'PcB@*XC5"TER4PFQ&MG'PfC5"[F(4TEfiYFf9dG'PZC`#3"I8!#J%
+'!3X&'d4TFf&LE'8JBA*RBbpKFQGf)'9YG@aKG'P[EQF!N!3"#!!+!4S"#`8K4'9
+XBANJBfpZFfpXC5"hD@jNEhFJG@jdD@`JEQ9PC'9N)!#3"EJ!S!$)!1X3!*!'c!#
+J!0`!ka!!N!8"(`$9!6-"$`3#6dX!N!3"(`!+!6-!4`3'3f&ZBf9X!*!&"J!Q!"F
+!lSJD8(PdD'pZ)'PZG'9bF(*PG'9b)'p`G'P[ER-!N!@-!!S!R!%,L"T,C@9`)(0
+dC'P[)(GTEQ4[Gb"[F'9Z)'pZ1J#3"EJ!#J$*!*H)&84PCQ&eE(3JCQPXC5"MFQ9
+KG'pb1Q8!N!A-!!S!h3#AL"*%C@CKG@ad)'CTE'8JG(P`C6S!!!%!!!!0[`!!$,m
+!!!&"!9bMV$%f!!!!(!%b!!Y#6N4-!!!!BNP$6L-!!!"Z8dPD43!!!(T'8N9'!!%
+!KQPMFb-!!!#HD@0X1!!!!+TTBh-i!!!!YQPMFc3!!!$#D@0X0!!!!-j%6%p(!!%
+!fN4*9%`!!3$b8(Pd-!!!!3S!J2rr!!!*'J#3"!%Xrrm!N!MrN!3!!!%%!*!&J2r
+r!!!"%J#3"B(rr`!!#3m!N!3",2rr!!!"(3#3"!%Xrrm!!!&K!*!%!5crr`!!"@8
+!N!3",2rr!!!'D3#3"!%Xrrm!!!EY!*!%!Irrr`!!#2%!N!3"r[rr!!!+8!#3"!(
+rrrm!!!P#!9bM+!(qrrm!!!TT!9bP$!#3"JN+!*!%$NphEQ9b)(*PFfpeFQ0P8i%
+:
