From VisualWorks®, 7.6 of February 8, 2008 on February 8, 2008 at 1:02:06 pm (Dialog confirm: 'You are filing-in a Parcel source file!\\While this is possible it will not have\the same effect as loading the parcel.\None of the Parcel''s prerequisites will\be loaded and none of its load actions\will be performed.\\Are you sure you want to file-in?' withCRs) ifFalse: [self error: 'Parcel file-in abandoned. Choose terminate or close.'] <class> <name>PackagingItem</name> <environment>VisualWorks</environment> <super>Core.Object</super> <private>false</private> none <imports></imports> <category>VisualWorksInstaller</category> <attributes> <package>VWInstallerFramework</package> </attributes> </class> <comment> VisualWorks.PackagingItem
Abstract class providing common behavior for printing, storing as spec, decoding from spec, and comparing. Subclasses must implement the following messages: comparing hash
</comment> <class> <name>SeedFile</name> <environment>VisualWorks</environment> <super>VisualWorks.PackagingItem</super> <private>false</private> none components location <imports></imports> <category>VWInstallerFramework</category> <attributes> <package>VWInstallerFramework</package> </attributes> </class> <comment> VisualWorks.SeedFile
SeedFile is an abstract class representing files that contain data needed for the installer to perform either an install or an uninstall. Instance Variables: components <ProductComponents> list of components either read from the install seed file, or to be written to the uninstall seed file location <Filename> the filename or URL where the seedfile is actually located
</comment> <class> <name>AbstractWizardPage</name> <environment>VisualWorks</environment> <super>UI.ApplicationModel</super> <private>false</private> none pageTitle parent scrollTextToBottom text <imports></imports> <category>VisualWorksInstaller</category> <attributes> <package>VWInstallerFramework</package> </attributes> </class> <comment> VisualWorks.AbstractWizardPage
Provides common behavior for wizard pages in the installer. Instance Variables: pageTitle <Text> displayed at top of wizard page parent <InstallerMainApplication> the main installer wizard in whose subcanvas instances of this class can be embedded scrollTextToBottom <Boolean> tells whether the top or bottom of long text will be initially visible in the text editor text <ValueModel> value holder for messages displayed in text editor used by many wizard pages
</comment> <class> <name>LicenseVerifierPage</name> <environment>VisualWorks</environment> <super>VisualWorks.AbstractWizardPage</super> <private>false</private> none accepted <imports></imports> <category>VisualWorksInstaller</category> <attributes> <package>VWInstallerFramework</package> </attributes> </class> <comment> VisualWorks.LicenseVerifierPage
Provides the UI for displaying and accepting a license agreement, if required before proceeding with installation. Instance Variables: accepted <Boolean> indicates user's acceptance of the agreement
</comment> <class> <name>InstallerPackager</name> <environment>VisualWorks</environment> <super>Core.Object</super> <private>false</private> none packagingDirectory tempImage workingChangesFile workingImage workingVM <imports></imports> <category>VisualWorksInstaller</category> <attributes> <package>VWInstallerFramework</package> </attributes> </class> <comment> VisualWorks.InstallerPackager
Provides ability to create a stripped installer image from the working dev image, and package it as appropriate for various platforms. Instance Variables: packagingDirectory <Filename> working directory for packaging the installer tempImage <Filename> temporary filename for writing new image files workingChangesFile <Filename> changes file associated with workingImage workingImage <Filename> image file to strip and package workingVM <Filename> the virtual machine currently running used to launch the workingImage while stripping
</comment> <class> <name>ComponentSelectorPage</name> <environment>VisualWorks</environment> <super>VisualWorks.AbstractWizardPage</super> <private>false</private> none componentName description selectMenuChannel showDescriptionInterrupt spaceRequired <imports></imports> <category>VisualWorksInstaller</category> <attributes> <package>VWInstallerFramework</package> </attributes> </class> <comment> VisualWorks.ComponentSelectorPage
Displays list of components that can be selected for install / uninstall. Also tracks mouse movement within the bounds of the list to display additional information about the list item under the mouse. Instance Variables: componentName <ValueModel> cache to eliminate extra redisplay of help text if mouse is has moved within the bounds of the same item in the list description <ValueModel> holds the description text of the component under the mouse for display in the UI selectMenuChannel <ValueModel> model for the menu button which allows selecting groups of several components at once showDescriptionInterrupt <Process> forked process which controls processing of mouse moved events to smooth out the display of description text spaceRequired <ValueModel> holds the sum of disk space required to install the selected components
</comment> <class> <name>MergedPackagingItem</name> <environment>VisualWorks</environment> <super>VisualWorks.PackagingItem</super> <private>false</private> none mergedAttributes <imports></imports> <category>VisualWorksInstaller</category> <attributes> <package>VWInstallerFramework</package> </attributes> </class> <comment> VisualWorks.MergedPackagingItem
Provides the ability to share installation objects among distributions through late binding of attributes, which saves space in the packing list spec and simplifies user editing of the packing list. Some of the attributes are bound at packaging time, others at install time. Instance Variables: mergedAttributes <Dictionary> arrays of attributes keyed by id of ProductReleases which include this object
</comment> <class> <name>FileAssociation</name> <environment>VisualWorks</environment> <super>VisualWorks.MergedPackagingItem</super> <private>false</private> none description extension name target <imports></imports> <category>VisualWorksInstaller</category> <attributes> <package>VWInstallerFramework</package> </attributes> </class> <comment> VisualWorks.FileAssociation
Holds information about file associations to set during installation, such as .doc -> Microsoft Word, or .im -> visual, etc. Instance Variables: description <String> one line description of the file type extension <CharacterArray> the key or signature of the association, typically some characters following a period, such as .txt or .html name <String> name of the type, such as 'text file' or 'Word document' target <(ExpandablePath of: Symbol | String)> the path to the executable associated with this file type
</comment> <class> <name>InstallerPackagerWindows</name> <environment>VisualWorks</environment> <super>VisualWorks.InstallerPackager</super> <private>false</private> none addCommand tempExecutable workingExecutable <imports></imports> <category>VisualWorksInstaller</category> <attributes> <package>VWInstallerFramework</package> </attributes> </class> <comment> VisualWorks.InstallerPackagerWindows
Packages the installer for Windows as a single-exe using ResHacker to embed the image, icons, and other files as resources. Instance Variables: addCommand <String> command to launch ResHacker with command line options to add a resource tempExecutable <Filename> temporary filename for writing new executable files workingExecutable <Filename> executable file to package
</comment> <class> <name>InstallMap</name> <environment>VisualWorks</environment> <super>VisualWorks.SeedFile</super> <private>false</private> none dynamicAttributes licenseAccepted readState readStateSemaphore scanProcess <imports></imports> <category>VisualWorksInstaller</category> <attributes> <package>VWInstallerFramework</package> </attributes> </class> <comment> VisualWorks.InstallMap
Holds information read from a file about what is to be installed. Instance Variables: dynamicAttributes <Dictionary> miscellaneous attributes of the application to be installed that were read in from the file licenseAccepted <Boolean> caches whether user accepts license agreement, if applicable readState <Symbol> indicates whether this object has been initialized from the source file, or whether some error occurred while reading the file readStateSemaphore <Semaphore> provides access protection for reading the source file in forked processes, and prevents duplicate readings of the file scanProcess <Process> scans location and initializes attributes with the contents
</comment> <class> <name>UninstallerPage</name> <environment>VisualWorks</environment> <super>VisualWorks.AbstractWizardPage</super> <private>false</private> none component ignorePolicies progressIncrement removedSoFar removeModifiedFilePolicy removeNonEmptyDirectoryPolicy skippedDirectories skippedFiles tempRemoved totalProgress totalToRemove unremovableDirectories unremovableFiles workProcess workSemaphore <imports></imports> <category>VisualWorksInstaller</category> <attributes> <package>VWInstallerFramework</package> </attributes> </class> <comment> VisualWorks.UninstallerPage
Provides the UI and behavior for uninstalling selected components. Instance Variables: component <ValueModel> aspect of UI showing name of component being uninstalled ignorePolicies <Boolean> flag to allow first pass removal of files without policy dialogs - they are only raised on second pass progressIncrement <Object> the minimum number of files to remove before updating the progress widget removedSoFar <ArithmeticValue> number of files removed so far, used to calculate overall progress ratio removeModifiedFilePolicy <ValueModel> indicates action to take when about to remove a file that was modified since it was installed removeNonEmptyDirectoryPolicy <ValueModel> indicates action to take when about to remove a directory that had files added since it was installed skippedDirectories <(Collection of: Filename)> collector for directories that were not removed during uninstall skippedFiles <(Collection of: Filename)> collector for files that were not removed during uninstall tempRemoved <ArithmeticValue> number of files removed since last progress update totalProgress <ValueModel> UI model for total progress widget totalToRemove <Number> total number of files, directories, etc., to remove unremovableDirectories <Collection> directories that could not be removed during uninstall unremovableFiles <Collection> files that could not be removed during uninstall workProcess <Process> forked process for uninstalling components workSemaphore <Semaphore> signalled when work complete to facilitate scripted uninstalls
</comment> <class> <name>SummaryPage</name> <environment>VisualWorks</environment> <super>VisualWorks.AbstractWizardPage</super> <private>false</private> none verbose <imports></imports> <category>VisualWorksInstaller</category> <attributes> <package>VWInstallerFramework</package> </attributes> </class> <comment> VisualWorks.SummaryPage
Provides the UI for the summary wizard page, showing all the install options for final confirmation before installing. Instance Variables: verbose <Boolean> determines whether to print only selected components, or all components with selections marked
</comment> <class> <name>ComponentLog</name> <environment>VisualWorks</environment> <super>VisualWorks.PackagingItem</super> <private>false</private> none description environmentItems fileAssociations files name startItems <imports></imports> <category>VisualWorksInstaller</category> <attributes> <package>VWInstallerFramework</package> </attributes> </class> <comment> VisualWorks.ComponentLog
Holds log information of components that were installed, listing specific files and other changes to the system made during install. Instance Variables: description <String> one line description of the component environmentItems <Collection> environment variables (or registry keys) set during installation fileAssociations <Collection> fileAssociations set during installation files <Collection> files copied during installation name <CharacterArray | FileMapCache> name of component startItems <Collection> used to create startup scripts on unix or shortcuts on windows for convenience in starting the application after installation
</comment> <class> <name>RemoveModifiedFileDialog</name> <environment>Tools</environment> <super>Tools.PolicyDialog</super> <private>false</private> none <imports></imports> <category>VisualWorksInstaller</category> <attributes> <package>VWInstallerFramework</package> </attributes> </class> <comment> Tools.RemoveModifiedFileDialog
Dialog raised to ask user what to do during uninstall when a file has been modified since its installation.
</comment> <class> <name>ProductComponent</name> <environment>VisualWorks</environment> <super>VisualWorks.PackagingItem</super> <private>false</private> none archive description environmentItems fileAssociations id name prereqs selectByDefault sizeCompressed sizes startItems target <imports></imports> <category>VisualWorksInstaller</category> <attributes> <package>VWInstallerFramework</package> </attributes> </class> <comment> VisualWorks.ProductComponent
Represents some named component of the application to install, specifying elements to be installed. Instance Variables: archive <(ExpandablePath of: (String | Symbol))> location of packaged component on CD description <String> brief description of component environmentItems <List> environment variables (or registry entries) to be set during install fileAssociations <List> file type associations to be set during install id <Integer> identifier that is unique within a particular distribution, or ProductRelease name <String> name of component prereqs <List> of ProductComponent names required for this one to function properly selectByDefault <Boolean> indicates whether this component should be selected for install by default sizeCompressed <Integer> size in bytes of packaged archive sizes <(Collection of: Integer)> sizes of individual files to be extracted from archive, used by the installer to calculate disk space needed startItems <List> Unix scripts or Windows shortcuts to be created during install target <Object> install path of this component, relative to install directory chosen at install time
</comment> <class> <name>InstallerPackagerPowermac</name> <environment>VisualWorks</environment> <super>VisualWorks.InstallerPackager</super> <private>false</private> none <imports></imports> <category>VisualWorksInstaller</category> <attributes> <package>VWInstallerFramework</package> </attributes> </class> <comment> VisualWorks.InstallerPackagerPowermac
Packages the installer for Powermac using Stuffit for Linux. The resulting .sit file contains .bin files which should be decoded on a Mac and the .sit file repackaged natively with the decoded files.
</comment> <class> <name>InstallerSAXDriver</name> <environment>VisualWorks</environment> <super>XML.SAXDriver</super> <private>false</private> none configuration key <imports> XML.* </imports> <category>VWInstallerFramework</category> <attributes> <package>VWInstallerFramework</package> </attributes> </class> <comment> VisualWorks.InstallerSAXDriver
Parses installerConfiguration.xml file into a dictionary where the xml tags serve as the keys for their enclosed data values. Instance Variables: configuration <Dictionary> repository for parsed config data key <Object> key (xml tag) currently being parsed
</comment> <class> <name>SeedFileDialog</name> <environment>VisualWorks</environment> <super>UI.SimpleDialog</super> <private>false</private> none newSeedString pattern prompt <imports></imports> <category>VWInstallerFramework</category> <attributes> <package>VWInstallerFramework</package> </attributes> </class> <comment> VisualWorks.SeedFileDialog
Dialog for either entering a file (local or remote) by hand, or browsing the local file system. Instance Variables: newSeedString <ValueModel> the string representation of the seed file pattern <Association> file type pattern for FileDialogs prompt <ValueHolder> text description of expected user input
</comment> <class> <name>InstallerPage</name> <environment>VisualWorks</environment> <super>VisualWorks.AbstractWizardPage</super> <private>false</private> none archiver cannotMakeDirectory cannotWriteFile componentProgress currentComponent information maxProgressCount privatizeUnwritableCommonShortcutPolicy retryCount status statusUpdateProcess targetFile totalProgress workProcess workSemaphore <imports> Smalltalk.Shortcut Smalltalk.ProgressWidgetSpec </imports> <category>VisualWorksInstaller</category> <attributes> <package>VWInstallerFramework</package> </attributes> </class> <comment> VisualWorks.InstallerPage
Provides the UI and behavior for installing selected components. Instance Variables: archiver <TGZArchiver> stream for extracting tgz files cannotMakeDirectory <(Collection of: Object)> directories that could not be created during install cannotWriteFile <(Collection of: (Array))> attribute arrays describing files that could not be written during install componentProgress <ProgressModel> model for component progress widget currentComponent <ProductComponent> cache of component currently being installed information <WriteStream> collector of special instructions to be presented to user after install maxProgressCount <Integer> count that limits progress deviations from accumulating from component to component privatizeUnwritableCommonShortcutPolicy <ValueModel> symbol indicating action to be taken when shortcut cannot be written to common area retryCount <ArithmeticValue> number of retries so far attempting to access file status <ValueModel> frequently updated string showing bytes / time so far, to go, etc. statusUpdateProcess <Process> updates 'status' every second targetFile <ValueModel> model for widget displaying archive file currently being extracted totalProgress <ProgressModel> model for total progress widget workProcess <Process> forked process for installing components workSemaphore <Semaphore> signalled when work complete to facilitate scripted installs
</comment> <class> <name>InclusionPattern</name> <environment>VisualWorks</environment> <super>Core.Object</super> <private>false</private> none include pattern <imports></imports> <category>VisualWorksInstaller</category> <attributes> <package>VWInstallerFramework</package> </attributes> </class> <comment> VisualWorks.InclusionPattern
Instances represent a rule of inclusion for arbitrary strings. If some string matches 'pattern', the 'include' boolean applies to that string. Instance Variables: include <Boolean> If true, strings matching 'pattern' are included. Otherwise strings matching 'pattern' are excluded. pattern <String> Only strings matched by 'pattern' should be constrained by 'include'.
</comment> <class> <name>InstallImageStripper</name> <environment>VisualWorks</environment> <super>Core.Object</super> <private>false</private> none <imports></imports> <category>VisualWorksInstaller</category> <attributes> <package>VWInstallerFramework</package> </attributes> </class> <comment> VisualWorks.InstallImageStripper
Provides behavior to strip the image for deployment using RuntimePackager without user interaction.
</comment> <class> <name>ChooseDirectoryPage</name> <environment>VisualWorks</environment> <super>VisualWorks.AbstractWizardPage</super> <private>false</private> none <imports></imports> <category>VisualWorksInstaller</category> <attributes> <package>VWInstallerFramework</package> </attributes> </class> <comment> VisualWorks.ChooseDirectoryPage
UI for selecting the target installation directory.
</comment> <class> <name>InstallOptions</name> <environment>VisualWorks</environment> <super>Core.Object</super> <private>false</private> none installDirectory selections <imports></imports> <category>VisualWorksInstaller</category> <attributes> <package>VWInstallerFramework</package> </attributes> </class> <comment> VisualWorks.InstallOptions
Cache of [un]install options related to a particular seed file. Instance Variables: installDirectory <String> directory to which the application will be installed selections <Collection of ProductComponent> selected components
</comment> <class> <name>StartItem</name> <environment>VisualWorks</environment> <super>VisualWorks.MergedPackagingItem</super> <private>false</private> none arguments default description group location longDescription path shared workingDirectory <imports></imports> <category>VisualWorksInstaller</category> <attributes> <package>VWInstallerFramework</package> </attributes> </class> <comment> VisualWorks.StartItem
Holds information about Unix scripts or Windows shortcuts to create during installation. Instance Variables: arguments <ExpandablePath> arguments to the executable, such as which image file to load default <Boolean> indicates whether this item should be launched after install is complete description <String> the name of the script or shortcut group <String> for Windows, the program group in the start menu location <ByteSymbol> ignored on Unix, on Windows either #desktop or #menu to indicate where to create the shortcut longDescription <Object> more detailed version of description, appears as popup help on Windows path <ExpandablePath> path to the executable (object engine) shared <Boolean> indicates whether the shortcut should be created in the shared menu/desktop, or the user's private menu/desktop workingDirectory <ExpandablePath> the working directory to set when launching the script / shortcut
</comment> <class> <name>EnvironmentItem</name> <environment>VisualWorks</environment> <super>VisualWorks.MergedPackagingItem</super> <private>false</private> none name value <imports></imports> <category>VisualWorksInstaller</category> <attributes> <package>VWInstallerFramework</package> </attributes> </class> <comment> VisualWorks.EnvironmentItem
Holds information about environment variables (or registry keys) to set during installation. Instance Variables: name <String> name of the variable to set, such as 'VISUALWORKS' value <String> value of the variable to set, such as 'c:\Program Files\Cincom Systems, Inc.\vw7.3'
</comment> <class> <name>ExpandablePath</name> <environment>VisualWorks</environment> <super>Core.OrderedCollection</super> <private>false</private> objects <imports></imports> <category>VisualWorksInstaller</category> <attributes> <package>VWInstallerFramework</package> </attributes> </class> <comment> VisualWorks.ExpandablePath
A collection of strings or symbols representing a path, such as the components of aFilename. Each symbol represents a macro. When the path is resolved, or "expanded", each macro is sent as a message to the resolver object(s). The resolver answers a collection of zero or more items to replace the macro. Instances are used to specify a partial path, but allow late binding of any elements thereof.
</comment> <class> <name>CheckServerPage</name> <environment>VisualWorks</environment> <super>VisualWorks.AbstractWizardPage</super> <private>false</private> none scanProgressProcess scanText versionString <imports></imports> <category>VWNetInstallerNC</category> <attributes> <package>VWInstallerFramework</package> </attributes> </class> <comment> VisualWorks.CheckServerPage
Provides the UI for initiating and summarizing the results of scanning config files on remote servers. Any additional versions listed in the remote config file will be added to the list of applications the user could select to install. Also, any recent patches listed in the remote config file can be applied to the image before continuing. Instance Variables: scanProgressProcess <Process> periodically updates scanText with progress of various forked scan processes scanText <Text> log of remote server scan versionString <ValueModel> installer version from parent
</comment> <class> <name>UnwritableCommonShortcutDialog</name> <environment>Tools</environment> <super>Tools.PolicyDialog</super> <private>false</private> none <imports></imports> <category>VisualWorksInstaller</category> <attributes> <package>VWInstallerFramework</package> </attributes> </class> <comment> Tools.UnwritableCommonShortcutDialog
Dialog raised to ask user what to do during install when a shortcut could not be created in the common (shared) location.
</comment> <class> <name>InstallLog</name> <environment>VisualWorks</environment> <super>VisualWorks.SeedFile</super> <private>false</private> none applicationName currentComponent dirty external unnamedComponent status <imports></imports> <category>VisualWorksInstaller</category> <attributes> <package>VWInstallerFramework</package> </attributes> </class> <comment> VisualWorks.InstallLog
Holds information about what was installed, and can store and retrieve this information to a file. These are created by the installer and used later by the uninstaller. Instance Variables: applicationName <String> name of the installed application for which this log is a record currentComponent <ComponentLog> component currently being installed dirty <Boolean> indicates whether any information has changed, which happens during install / uninstall external <Boolean> true indicates this is not a true log, but a placeholder for launching an external uninstaller unnamedComponent <ComponentLog> holds miscellaneous install actions that were not part of a specific component
</comment> <class> <name>InstallerPackagerUnix</name> <environment>VisualWorks</environment> <super>VisualWorks.InstallerPackager</super> <private>false</private> none archiver <imports></imports> <category>VisualWorksInstaller</category> <attributes> <package>VWInstallerFramework</package> </attributes> </class> <comment> VisualWorks.InstallerPackagerUnix
Packages the installer for all Unix platforms, when running on a Unix platform. Most Unix platforms use Makeself (see http://www.megastep.org/makeself/), but MacOSX uses Stuffit for Linux. Instance Variables: archiver <Filename> location of the makeself.sh script
</comment> <class> <name>RemoveNonEmptyDirectoryDialog</name> <environment>Tools</environment> <super>Tools.PolicyDialog</super> <private>false</private> none <imports></imports> <category>VisualWorksInstaller</category> <attributes> <package>VWInstallerFramework</package> </attributes> </class> <comment> Tools.RemoveNonEmptyDirectoryDialog
Dialog raised to ask user what to do during uninstall when a directory has had files added to it since its creation during install.
</comment> <class> <name>InstallMapAdjustor</name> <environment>VisualWorks</environment> <super>Core.Object</super> <private>false</private> none filename sourceStream destinationStream <imports></imports> <category>VisualWorksInstaller</category> <attributes> <package>VWInstallerFramework</package> </attributes> </class> <comment> VisualWorks.InstallMapAdjustor
During packaging, the packaging image may be a different 'version' than the image to be installed (this image). This class is used by InstallerMainApplication and will accept an filename (or string) and update that file with changes that needed to be made to the attributes. This class assume that attributes to be changed appear alphabetically in the file. Currently, the attributes in the install.map that will change are: The VI signature The application version The registry path for windows Typical usage of this class would be something like: InstallMapAdjustor amend: 'install.map' that would do the adjustment of install.map all in one pass. Otherwise, a client could do: adjustor := InstallMapAdjustor new. adjustor filename: 'install.map'. adjustor amend. Instance Variables: filename <Filename> The filename to adjust. This will also be used as the destination file for the final results. sourceStream <InternalStream> The contents of the original file destinationStream <InternalStream> The adjusted contents
</comment> <class> <name>InstallerMainApplication</name> <environment>VisualWorks</environment> <super>UI.ApplicationModel</super> <private>false</private> none components configuration desktopShortcut expressInstall installAction installDirectory installOptions scanProcesses scanQueue screens serverChecked seedLog seedLogs seedMap seedMaps subApps tgtDir updateApplied <imports></imports> <category>VisualWorksInstaller</category> <attributes> <package>VWInstallerFramework</package> </attributes> </class> <comment> VisualWorks.InstallerMainApplication
The main installer application, whose UI consists of a wizard template with pages displayed in turn on a subcanvas. Instance Variables: components <MultiSelectionInList> components to select for install / uninstall configuration <Dictionary> dictionary of values from config file(s) desktopShortcut <ValueHolder> boolean indicates whether to install a shortcut on the desktop expressInstall <ValueHolder> boolean indicates whether to use default options, skipping custom input wizard pages installAction <ValueHolder> symbol #Install or #Uninstall to indicate which action to perform installDirectory <ValueHolder> string target directory path for install installOptions <IdentityDictionary> holds "global" options (many of which come from the command line) as well as options specific to the selected seed file scanProcesses <Dictionary> holds the active processes scanning remote config files, keyed by the URLs of the files scanQueue <SharedQueue> synchronizes config file URL access between forked processes screens <SelectionInList> list of wizard page classes whose index indicates currently displayed wizard page serverChecked <ValueHolder> boolean indicates whether config file on default server has been scanned seedLog <ValueModel> selected InstallLog for uninstall seedLogs <(List of: InstallLog)> InstallLogs available for uninstall seedMap <ValueModel> selected InstallMap for uninstall seedMaps <(List of: InstallMap)> InstallMaps available for uninstall subApps <Dictionary> wizard pages by class tgtDir <Filename> cached result of 'installDirectory asFilename' updateApplied <Boolean> if true prevent re-check for updates after update/restart
</comment> <class> <name>ThanksPage</name> <environment>VisualWorks</environment> <super>VisualWorks.AbstractWizardPage</super> <private>false</private> none <imports></imports> <category>VisualWorksInstaller</category> <attributes> <package>VWInstallerFramework</package> </attributes> </class> <comment> VisualWorks.ThanksPage
Provides the UI for the final wizard page of the install or uninstall.
</comment> <class> <name>SeedSelectorPage</name> <environment>VisualWorks</environment> <super>VisualWorks.AbstractWizardPage</super> <private>false</private> none location seedFile seedFiles <imports></imports> <category>VisualWorksInstaller</category> <attributes> <package>VWInstallerFramework</package> </attributes> </class> <comment> VisualWorks.SeedSelectorPage
Provides the UI for selecting either the install or uninstall action, and for selecting the source file on which to perform that action. The main focus of this class is to customize the display of the selected source file based on the state of other values. Instance Variables: location <ValueModel> displays the location aspect of the selected source file seedFile <AspectAdaptor> (InstallMap | InstallLog) currently selected source file seedFiles <AspectAdaptor> (Collection of InstallMap | InstallLog) drop down list of source files available to install / uninstall
</comment> <class> <name>ActionSelectorPage</name> <environment>VisualWorks</environment> <super>VisualWorks.AbstractWizardPage</super> <private>false</private> none customText installAction typicalText uninstallText <imports></imports> <category>VisualWorksInstaller</category> <attributes> <package>VWInstallerFramework</package> </attributes> </class> <comment> VisualWorks.ActionSelectorPage
Provides the UI for choosing between Install / Uninstall. Instance Variables: customText <ValueHolder> instructions for the 'custom' radio button installAction <ValueHolder> symbol [#express|#custom|#uninstall] indicating steps to take next typicalText <ValueHolder> instructions for the 'typical' radio button uninstallText <ValueHolder> instructions for the 'uninstall' radio button
</comment> <name>StartupClass</name> <environment>VisualWorks.InstallImageStripper</environment> <private>false</private> <constant>false</constant> <category>options</category> <initializer>VisualWorks.InstallerMainApplication</initializer> <attributes> <package>VWInstallerFramework</package> </attributes> <name>RemoteExceptions</name> <environment>VisualWorks</environment> <private>false</private> <constant>true</constant> <category>VWInstallerFramework</category> <initializer>(ExceptionSet withAll: Net.FTPSignal withAllSubclasses) , Net.FTPReadFailure , OSErrorHolder peerFaultSignal , OsInaccessibleError</initializer> <attributes> <package>VWInstallerFramework</package> </attributes> <name>UsePassiveFTP</name> <environment>VisualWorks.InstallMap</environment> <private>false</private> <constant>false</constant> <category>remote access</category> <initializer>true</initializer> <attributes> <package>VWInstallerFramework</package> </attributes> <name>VmByPlatformId</name> <environment>VisualWorks.InstallerMainApplication</environment> <private>false</private> <constant>false</constant> <category>platform support</category> <initializer>VisualWorks.InstallerMainApplication vmByPlatformIdDictionary</initializer> <attributes> <package>VWInstallerFramework</package> </attributes> <name>Debugging</name> <environment>VisualWorks.InstallerMainApplication</environment> <private>false</private> <constant>false</constant> <category>testing</category> <initializer>true</initializer> <attributes> <package>VWInstallerFramework</package> </attributes> <methods> VisualWorks.PackagingItem <category>utils</category>
pathFromString: pathString "pathString represents a filename. Break it into component strings and verify it." ^self verifyPath: (Filename components: pathString)
symbolOrString: aString "aString is either a String, or a string representation of a symbol. Answer aString or the symbol it represents. To allow explicit use of a string which begins with a hash mark, without interpreting it as a symbol, the first (and only the first) hash mark of the component string is delimited by an extra hash mark. In that case, strip off the extra hash mark and answer the rest of aString." | object | ^aString first == $# ifTrue: [(1 < aString size and: [(aString at: 2) == $#]) ifTrue: [aString copyFrom: 2 to: aString size] ifFalse: [(object := Compiler new evaluate: aString in: nil receiver: nil notifying: SilentCompilerErrorHandler new ifFail: [^aString]) isSymbol ifTrue: [object] ifFalse: [aString]]] ifFalse: [aString]
verifyPath: pathCollection "pathCollection represents string components of a filename. Convert strings to symbols, where appropriate, to denote repetition of some aspect of another object, such as a ProductRelease." | newComponents | newComponents := OrderedCollection new. pathCollection do: [:string | string isEmpty ifFalse: [newComponents add: (self symbolOrString: string)]]. ^newComponents
</methods> <methods> VisualWorks.PackagingItem <category>comparing</category>
= aPackagingItem ^self class == aPackagingItem class and: [self instVarNamesForComparison noneSatisfy: [:instVarName | (self perform: instVarName asSymbol) ~= (aPackagingItem perform: instVarName asSymbol)]]
hash ^self subclassResponsibility
instVarNamesForComparison ^self class allInstVarNames
</methods> <methods> VisualWorks.PackagingItem <category>initialize-release</category>
fromLiteralArrayEncoding: anArray | argument selector | 2 to: anArray size by: 2 do: [:i | ((argument := anArray at: i + 1) isSequenceable and: [argument isString not and: [argument isEmpty not and: [argument isLiteral]]]) ifTrue: [argument := self decodeCollection: argument]. selector := (anArray at: i) == #environementItems: ifTrue: [#environmentItems:] ifFalse: [anArray at: i]. [self perform: selector with: argument] on: MessageNotUnderstood do: [:ex | ex return]]
fromVersion2LiteralArrayEncoding: anArray self fromLiteralArrayEncoding: anArray
initialize ^self
</methods> <methods> VisualWorks.PackagingItem <category>printing</category>
instVarNamesForInstall ^self class allInstVarNames asSortedCollection
store: anObject on: aStream | str | anObject class == Dictionary ifTrue: [str := (String new: 256) writeStream. anObject keysAndValuesDo: [:key :value | key isImmutable ifFalse: [key isImmutable: true]. value isImmutable ifFalse: [value isImmutable: true]]. anObject storeOn: str. aStream print: str contents] ifFalse: [anObject isImmutable ifFalse: [anObject isImmutable: true]. anObject storeOn: aStream]
</methods> <methods> VisualWorks.PackagingItem <category>backward compatability</category>
decodeCollection: aCollection ^[aCollection decodeAsLiteralArray] on: Object errorSignal do: [:ex1 | ex1 return: ([aCollection collect: [:subArray | subArray decodeAsLiteralArray]] on: Object errorSignal do: [:ex2 | ex2 return: aCollection])]
</methods> <methods> VisualWorks.PackagingItem class <category>private - backward compatability</category>
decodeFromVersion2LiteralArray: anArray ^self new fromVersion2LiteralArrayEncoding: anArray
</methods> <methods> VisualWorks.PackagingItem class <category>instance creation</category>
decodeFromLiteralArray: anArray ^self new fromLiteralArrayEncoding: anArray
new ^super new initialize
</methods> <methods> VisualWorks.PackagingItem class <category>deployment</category>
dynamicallyReferencedSelectors ^#(#store:on:)
</methods> <methods> VisualWorks.SeedFile <category>accessing</category>
applicationName ^(#unnamedApplication << #installer >> 'unnamed application') asString
applicationName: aStringOrNil ^self subclassResponsibility
componentList ^(self components ifNil: [List new]) asList
components ^components
components: aCollection components := aCollection
external ^false
fullName ^self applicationName
location ^location
location: anObject location := anObject
</methods> <methods> VisualWorks.SeedFile <category>comparing</category>
= aSeedFile ^self class = aSeedFile class and: [self location = aSeedFile location]
hash ^self location hash
</methods> <methods> VisualWorks.SeedFile <category>printing</category>
displayStringForList: seedFiles ^#displayStringTemplate << #installer >> '<1s><2s>' expandMacrosWith: self fullName with: (self displayStringIdTagFor: seedFiles)
displayStringIdTagFor: seedFiles | myName ordinal | myName := self fullName. ordinal := 0. seedFiles detect: [:seedFile | seedFile fullName = myName ifTrue: [ordinal := ordinal + 1]. seedFile == self]. ^ordinal = 1 ifTrue: [String new] ifFalse: [#ordinalTemplate << #installer >> ' #<1p>' expandMacrosWith: ordinal]
</methods> <methods> VisualWorks.SeedFile <category>testing</category>
errorEncountered ^false
exists ^self location exists
forInstall ^false
requiresLicense ^false
</methods> <methods> VisualWorks.SeedFile <category>inquiries</category>
defaultSelections ^self components ifNil: [Set new] ifNotNil: [:collection | collection select: [:cmp | cmp selectByDefault]]
</methods> <methods> VisualWorks.SeedFile <category>updating</category>
waitForUpdates ^self
</methods> <methods> VisualWorks.AbstractWizardPage <category>private</category>
appendText: aTextOrStringOrUserMessage self appendText: aTextOrStringOrUserMessage to: #text
appendText: aTextOrStringOrUserMessage to: aspectSymbol | textHolder | textHolder := self perform: aspectSymbol. textHolder value: textHolder value , aTextOrStringOrUserMessage asText. self scrollWidgetToBottom: aspectSymbol
enabledButtons ^self parent allButtons
generateText ^Text new
pageTitleText ^self subclassResponsibility
scrollWidgetToBottom: widgetID self parent currentSubApp = self ifFalse: [^self]. (self widgetAt: widgetID) ifNotNil: [:view | view selectionIndex: view displayContents text size + 1. view selectAndScroll]
visibleButtons ^self parent allButtons
</methods> <methods> VisualWorks.AbstractWizardPage <category>accessing</category>
parent ^parent
parent: aProductInstaller parent := aProductInstaller
scrollTextToBottom ^scrollTextToBottom ifNil: [scrollTextToBottom := true] ifNotNil: [scrollTextToBottom]
scrollTextToBottom: anObject scrollTextToBottom := anObject
</methods> <methods> VisualWorks.AbstractWizardPage <category>updating</category>
updateText self updateText: self generateText
updateText: newText self text value = newText ifFalse: [self text value: newText]. self scrollTextToBottom ifTrue: [self scrollWidgetToBottom: #text]
</methods> <methods> VisualWorks.AbstractWizardPage <category>interface opening</category>
defaultAction ^self parent next
defaultButtonLabel ^self parent nextPageIsAction ifTrue: [self parent installAction value asString] ifFalse: [(#nextGTLabel << #installer >> 'Next >') expandMacros]
postBuildWith: aBuilder super postBuildWith: aBuilder. (self widgetAt: #text) ifNotNil: [:editor | editor controller: ControllerWithMenu new]. (self widgetAt: #pageTitle) ifNotNil: [:editor | editor controller: Controller new]. self updateText
</methods> <methods> VisualWorks.AbstractWizardPage <category>synchronization</category>
okToBuild "Answer whether this page should be displayed." ^true
okToCancel "Answer whether the installation may be cancelled while this page is displayed." ^true
okToProceed "Answer whether to proceed to the next page." ^true
okToSkip "If this page should not be displayed, answer whether this page may be skipped." ^true
</methods> <methods> VisualWorks.AbstractWizardPage <category>testing</category>
isActionPage ^false
</methods> <methods> VisualWorks.AbstractWizardPage <category>actions</category>
cancel "Perform any needed cleanup for immediate cancellation." ^self
</methods> <methods> VisualWorks.AbstractWizardPage <category>aspects</category>
pageTitle ^pageTitle ifNil: [pageTitle := self pageTitleText asValue]
text ^text ifNil: [text := Text new asValue]
</methods> <methods> VisualWorks.AbstractWizardPage class <category>instance creation</category>
parent: anApplicationModel ^self new parent: anApplicationModel
</methods> <methods> VisualWorks.LicenseVerifierPage <category>private</category>
generateText | licText | self scrollTextToBottom: false. (licText := self parent seedMap value license) ifNotNil: [^licText]. ^#{UI.SimpleHelp.LicenseAgreement} ifDefinedDo: [:textHolder | textHolder value] elseDo: [(#errorRetrievingNCLicense << #installer >> '%<Error retrieving the non-commercial license agreement:<n><t>UI.SimpleHelp.LicenseAgreement is not defined%>') expandMacros]
pageTitleText ^(#LicenseAgreement << #installer >> '<bl>License Agreement') expandMacros
</methods> <methods> VisualWorks.LicenseVerifierPage <category>interface opening</category>
postOpenWith: aBuilder super postOpenWith: aBuilder. self changedAccepted
</methods> <methods> VisualWorks.LicenseVerifierPage <category>updating</category>
changedAccepted self parent currentSubApp = self ifFalse: [^self]. (self accepted value notNil and: [self accepted value]) ifTrue: [self parent enableDefaultButton] ifFalse: [self parent disableDefaultButton]
</methods> <methods> VisualWorks.LicenseVerifierPage <category>actions</category>
copyText Screen default putExternalSelection: self text value
</methods> <methods> VisualWorks.LicenseVerifierPage <category>synchronization</category>
okToBuild ^self parent seedMap value ifNil: [false] ifNotNil: [:map | map readState. map license notNil]
okToProceed | agreed | agreed := self accepted value. agreed ifNil: [Dialog warn: #acceptToProceed << #installer >> 'Please review and accept the agreement in order to proceed.'. ^false]. agreed ifFalse: [Dialog warn: #acceptOrCancel << #installer >> 'Please review and accept the agreement, or cancel the installation.']. ^agreed
okToSkip ^self okToBuild not
</methods> <methods> VisualWorks.LicenseVerifierPage <category>aspects</category>
accepted ^accepted ifNil: [accepted := ((AspectAdaptor subjectChannel: self parent seedMap) forAspect: #licenseAccepted) onChangeSend: #changedAccepted to: self; yourself]
</methods> <methods> VisualWorks.InstallerPackager <category>accessing</category>
packagingDirectory ^packagingDirectory ifNil: [packagingDirectory := Filename defaultDirectory construct: 'VWInstaller'] ifNotNil: [packagingDirectory]
packagingDirectory: aDirectoryOrNil packagingDirectory := aDirectoryOrNil
tempImage ^tempImage ifNil: [tempImage := Filename defaultDirectory construct: 'temp.im'] ifNotNil: [tempImage]
uncompressedImage ^self workingImage directory construct: self workingImage prefix , 'Uncompressed.im'
workingChangesFile ^workingChangesFile ifNil: [workingChangesFile := Filename defaultDirectory construct: 'VWInstaller.cha'] ifNotNil: [workingChangesFile]
workingImage ^workingImage ifNil: [workingImage := Filename defaultDirectory construct: 'VWInstaller.im'] ifNotNil: [workingImage]
workingImage64 ^self workingImage directory construct: self workingImage prefix , '64Bit.im'
workingVM ^workingVM ifNil: [workingVM := CEnvironment commandLine first asFilename] ifNotNil: [workingVM]
</methods> <methods> VisualWorks.InstallerPackager <category>private</category>
backupUncompressedImage self workingImage copyTo: self uncompressedImage
checkOverwriteFile: aFilename (aFilename exists and: [(Dialog confirm: (#overwriteExistingFileTemplate << #installer >> 'overwrite existing <1s>?' expandMacrosWith: aFilename asString)) not]) ifTrue: [AbortPackaging raiseSignal]
compressImage: aFilename ObjectMemory compressImageFile: aFilename to: self tempImage resultsTo: [:a :b :c :d | ]. aFilename delete. self tempImage renameTo: aFilename
create64BitImage self workingImage64 exists ifTrue: [^self]. (#{VirtualImage} valueIfUndefinedLoadFrom: 'ImageWriter') cloneFrom: self uncompressedImage prefix to: self workingImage64 prefix target: #{McCartneyImmediateDoubles} value
createWorkingImage | prefix devImage connected | prefix := ObjectMemory imagePrefix. devImage := (prefix , '.im') asFilename. devImage isAbsolute ifFalse: [devImage := Filename defaultDirectory construct: devImage tail]. (self tempImage = devImage or: [self workingImage = devImage]) ifTrue: [^self error: #devImageOverwriteError << #installer >> 'should not overwrite dev image']. self checkOverwriteFile: self tempImage. self checkOverwriteFile: self workingImage. (connected := Store.DbRegistry isConnected) ifTrue: [Store.DbRegistry disconnect]. Snapshot new snapshot ifFalse: [AbortPackaging raiseSignal]. connected ifTrue: [Store.DbRegistry disconnect]. devImage copyTo: self workingImage. (prefix , '.cha') asFilename copyTo: self workingChangesFile
engineForPlatformByte: anInteger ^self engineFromPath: (self enginePathForPlatformByte: anInteger)
engineFromPath: anArray ^anArray inject: '$(VISUALWORKS)' asLogicalFileSpecification asFilename into: [:dir :tail | dir construct: tail]
enginePathForPlatformByte: anInteger | array | array := (InstallerMainApplication vmByPlatformId at: anInteger ifAbsent: [^self error: #unknownPlatform << #installer >> 'Unknown platform']) last. array last = 'visual' ifFalse: [array at: array size put: 'visual']. ^array
initializePackagingDirectory self packagingDirectory exists ifTrue: [self packagingDirectory deleteTreeForced]. self packagingDirectory createDirectory
initializePackagingDirectoryWithAll: filenames self initializePackagingDirectory. filenames do: [:fn | fn copyToDirectory: self packagingDirectory]
invokeStripCommand: aString ^ExternalProcess defaultClass shOne: aString
nextSave self replaceWorkingImage: self workingVM asString , ' ' , self workingImage asString timeout: 30
replaceWorkingImage: commandString timeout: seconds self runCommand: commandString timeout: seconds. self workingImage delete. self tempImage renameTo: self workingImage
runCommand: commandString timeout: seconds [ExternalProcess defaultClass shOne: commandString] valueWithinSeconds: seconds orDo: [self startImageTimeoutError]
startImage: commandString ExternalProcess defaultClass shOne: ('"<1s>" "<2s>" -stripInstallImage "<3s>"' expandMacrosWith: self workingVM asString with: self workingImage asString with: self tempImage asString)
startImageTimeoutError self error: '#startImage timed out'
startThreeStepStrip self replaceWorkingImage: ('"<1s>" "<2s>" -stripInstallImage "<3s>"' expandMacrosWith: self workingVM asString with: self workingImage asString with: self tempImage asString) timeout: 180
</methods> <methods> VisualWorks.ComponentSelectorPage <category>updating</category>
changedSelections self checkPrereqs. self spaceRequired value: self parent bytesRequired. self checkDesktopShortcutEnablement. self showDescriptionForTargetComponent
checkDesktopShortcutEnablement | desktopShortcutWrapper | desktopShortcutWrapper := self builder componentAt: #desktopShortcut. (self parent forUninstall or: [OSHandle currentOS ~~ #win32]) ifTrue: [^desktopShortcutWrapper beInvisible]. (self components selections anySatisfy: [:cmp | cmp startItems anySatisfy: [:stItm | stItm isForDesktop]]) ifTrue: [desktopShortcutWrapper enable] ifFalse: [desktopShortcutWrapper disable]
checkPrereq: aProductComponent | prereqName selectedComponents dependentComponents | prereqName := aProductComponent name. selectedComponents := self components selections. dependentComponents := self components list select: [:cmp | (cmp prereqs includes: prereqName) and: [selectedComponents includes: cmp]]. dependentComponents isEmpty ifTrue: [^self]. (self confirmDeselectDependents: dependentComponents) ifFalse: [^self]. self components selections: ((self components selections copy) removeAll: dependentComponents; yourself)
checkPrereqs | toggledComponent | self parent components selections size isZero ifTrue: [^self]. toggledComponent := self targetComponent ifNil: [^self]. (self components selections includes: toggledComponent) ifTrue: [self checkPrereqsOf: toggledComponent] ifFalse: [self checkPrereq: toggledComponent]
checkPrereqsOf: aProductComponent | allNames selectedNames missingPrereqNames | aProductComponent prereqs isEmpty ifTrue: [^self]. allNames := self components list collect: [:cmp | cmp name]. selectedNames := self components selections collect: [:cmp | cmp name]. missingPrereqNames := aProductComponent prereqs select: [:string | (allNames includes: string) and: [(selectedNames includes: string) not]]. missingPrereqNames isEmpty ifTrue: [^self]. (self confirmSelectPrereqs: missingPrereqNames) ifFalse: [^self]. self components selections: ((self components selections copy) addAll: (self components list select: [:cmp | missingPrereqNames includes: cmp name]); yourself)
confirmDeselectDependents: productComponents | dialogPrompt | dialogPrompt := String new writeStream. dialogPrompt nextPutAll: (productComponents size = 1 ifTrue: [#deselectPrereqDialog << #installer >> 'This component is required by the following.<n>Would you also like to remove it<n>from the list of components to install?'] ifFalse: [#deselectPrereqsDialog << #installer >> 'This component is required by the following.<n>Would you also like to remove them<n>from the list of components to install?']) expandMacros. productComponents do: [:cmp | dialogPrompt crtab; nextPutAll: cmp name]. ^Dialog confirm: dialogPrompt contents
confirmSelectPrereqs: strings | dialogPrompt | dialogPrompt := String new writeStream. dialogPrompt nextPutAll: (strings size = 1 ifTrue: [#selectPrereqDialog << #installer >> 'The component you selected<n>requires the following.<n>Select it also?'] ifFalse: [#selectPrereqsDialog << #installer >> 'The component you selected<n>requires the following.<n>Select them also?']) expandMacros. strings do: [:string | dialogPrompt crtab; nextPutAll: string]. ^Dialog confirm: dialogPrompt contents
processMouseMovedEvent: anEvent from: aController | index | index := aController cursorIndexForMouseEvent: anEvent. (index notNil and: [0 < index and: [index <= self components list size]]) ifFalse: [^self]. self showDescriptionFor: (self components list at: index)
selectMenuClicked self perform: self selectMenuChannel value
showDescriptionFor: aProductComponent | nameString | (nameString := aProductComponent name) = self componentName value asString ifTrue: [^self]. self componentName value: ((nameString asText) allBold; yourself). self description value: aProductComponent description
showDescriptionForTargetComponent self targetComponent ifNotNil: [:cmp | self showDescriptionFor: cmp]
trackKeyboardNavigationEvent: aKeyboardEvent self showDescriptionForTargetComponent
trackMouseExitEvent: anEvent from: aController "See the comment in #trackMouseMovedEvent:from:." self unscheduleShowDescriptionInterrupt
trackMouseMovedEvent: anEvent from: aController "Mouse has moved; the trick here is to set up an interrupt after a short delay to display the description, AND ALSO kill such an interrupt if it has been set before and hasn't fired. This produces the desired behavior of the description getting updated right after we move the mouse to it, but not while the mouse moves over other items. This, in combination with killing such interrupts on exiting the list, allows the user to move a mouse to the description box and scroll, without losing the description." self unscheduleShowDescriptionInterrupt; scheduleShowDescriptionInterruptFor: anEvent from: aController
</methods> <methods> VisualWorks.ComponentSelectorPage <category>actions</category>
selectAllComponents self components selectAll
selectDefaultComponents self components selections: self parent seedFile defaultSelections asSet
selectNoComponents self components selectionIndexes: Set new
</methods> <methods> VisualWorks.ComponentSelectorPage <category>initialize-release</category>
initialize super initialize. self selectMenuChannel onChangeSend: #selectMenuClicked to: self
</methods> <methods> VisualWorks.ComponentSelectorPage <category>aspects</category>
componentName ^componentName ifNil: [componentName := LazyValueHolder with: String new]
components ^self parent components
description ^description ifNil: [description := LazyValueHolder with: String new]
desktopShortcut ^self parent desktopShortcut
selectMenuChannel ^selectMenuChannel ifNil: [selectMenuChannel := nil asValue]
spaceRequired ^spaceRequired ifNil: [spaceRequired := 0 asValue]
</methods> <methods> VisualWorks.ComponentSelectorPage <category>interface opening</category>
installPrompt ^(#componentsToInstallPrompt << #installer >> '<bl>Components to Install') expandMacros
postBuildWith: aBuilder | cmpView | super postBuildWith: aBuilder. #(#componentName #description #spaceRequired) do: [:symbol | (self widgetAt: symbol) ifNotNil: [:editor | editor controller: Controller new]]. cmpView := self widgetAt: #components. ((cmpView controller) changeClassTo: Array; copyWith: self) changeClassTo: CursorSensitiveHelpSequenceController; become: cmpView controller. self components selectionIndexHolder onChangeSend: #changedSelections to: self. (self widgetAt: #spaceRequired) converter toPrint: self diskSpaceDisplayBlock toRead: nil. self parent forUninstall ifTrue: [self pageTitle value: self uninstallPrompt. (self widgetAt: #selectMenuButton) menu: self class selectMenuUninstall] ifFalse: [self pageTitle value: self installPrompt. (self widgetAt: #selectMenuButton) menu: self class selectMenuInstall]. self changedSelections
postOpenWith: aBuilder super postOpenWith: aBuilder. self setVisualBlockWith: aBuilder. (self widgetAt: #components) invalidate. self components selectionIndexHolder changed
setVisualBlockWith: aBuilder ((aBuilder componentAt: #components) widget) visualBlock: [:view :index | | item | item := view sequence at: index. BoundedWrapper on: (Label with: (self displayString: item displayString withSize: (item isString ifFalse: [item currentSize]) forView: view) attributes: view textStyle offset: 16 @ 0)]; selectedVisualBlock: [:view :index | | item | item := view sequence at: index. BoundedWrapper on: (LabelAndIcon with: (self displayString: item displayString withSize: (item isString ifFalse: [item currentSize]) forView: view) attributes: view textStyle) beCheckMark]
uninstallPrompt ^(#componentsToUninstallPrompt << #installer >> '<bl>Components to Uninstall') expandMacros
</methods> <methods> VisualWorks.ComponentSelectorPage <category>private</category>
pageTitleText ^Text new
scheduleShowDescriptionInterruptFor: aMouseMovedEvent from: aController showDescriptionInterrupt := [(Delay forMilliseconds: 50) wait. showDescriptionInterrupt := nil. self parent doInUIProcess: [self processMouseMovedEvent: aMouseMovedEvent from: aController]] forkAt: Processor userSchedulingPriority + 1
unscheduleShowDescriptionInterrupt "Note: the use of #ifNotNil: with a block argument is deliberate. Otherwise, a race condition is possible if the interrupt process wakes up and nils out showDescriptionInterrupt after the notNil test but before #terminate." showDescriptionInterrupt ifNotNil: [:interruptProcess | interruptProcess terminate]
</methods> <methods> VisualWorks.ComponentSelectorPage <category>printing</category>
diskSpaceDisplayBlock ^ [:integer | (self parent forInstall ifTrue: [#spaceRequiredLabel << #installer >> 'Space required: <1s>'] ifFalse: [#spaceToFreeLabel << #installer >> 'Space to free: <1s>']) expandMacrosWith: (integer ifNil: [0]) printAsDiskSpace]
displayString: aString withSize: size forView: aView | spaceString spaceWidth stringWidth sizeString sizeWidth spaces maxStringWidth string elipses maxWidth textAttributes | (size isNil or: [size = 0]) ifTrue: [^aString asString]. maxWidth := aView bounds extent x - 16. textAttributes := aView getTextStyle. spaceString := String with: Character space. spaceWidth := (ComposedText withText: spaceString style: textAttributes) width. sizeString := size printAsDiskSpace. sizeWidth := (ComposedText withText: sizeString style: textAttributes) width. maxStringWidth := maxWidth - sizeWidth - (3 * spaceWidth). string := aString. elipses := String new. [maxStringWidth < (stringWidth := (ComposedText withText: string , elipses style: textAttributes) width)] whileTrue: [elipses isEmpty ifTrue: [elipses := String new: 3 withAll: $.]. string := string copyFrom: 1 to: string size - 1]. spaces := String new: (maxWidth - stringWidth - sizeWidth) // spaceWidth - 2 withAll: Character space. ^spaceString , string , elipses , spaces , sizeString
</methods> <methods> VisualWorks.ComponentSelectorPage <category>synchronization</category>
okToBuild ^self parent isExpressInstall not
okToProceed ^self components selections notEmpty or: [self parent noComponentsSelectedDialog. false]
</methods> <methods> VisualWorks.ComponentSelectorPage <category>accessing</category>
targetComponent | targetIndex | targetIndex := (self widgetAt: #components) targetIndex. targetIndex isZero ifTrue: [^nil]. ^self components list at: targetIndex
</methods> <methods> VisualWorks.ComponentSelectorPage class <category>resources</category>
selectMenu ^self selectMenuInstall
</methods> <methods> VisualWorks.MergedPackagingItem <category>printing</category>
instVarNamesForInstall ^super instVarNamesForInstall copyWithout: 'mergedAttributes'
</methods> <methods> VisualWorks.MergedPackagingItem <category>initialize-release</category>
mergedAttributes: aStringOrDictionary mergedAttributes := aStringOrDictionary isString ifTrue: [Object readFromString: aStringOrDictionary] ifFalse: [aStringOrDictionary]
newMergedAttribute ^0
</methods> <methods> VisualWorks.MergedPackagingItem <category>accessing</category>
addAttributes: associations self mergedAttributeDictionary addAll: associations
allMergedAttributes ^self mergedAttributes ifNil: [Array new] ifNotNil: [:dictionary | dictionary associations]
attributesFor: aProductRelease ^(aProductRelease isNil or: [self mergedAttributes isNil]) ifTrue: [nil] ifFalse: [self mergedAttributes at: aProductRelease id ifAbsent: [nil]]
ensureAttributesFor: aProductRelease ^self mergedAttributeDictionary at: aProductRelease id ifAbsentPut: [self newMergedAttribute]
getComponentAsStringFor: aProductRelease ^(self getComponentFor: aProductRelease) ifNotNil: [:cmp | cmp name]
getComponentFor: aProductRelease ^aProductRelease ifNotNil: [| id | (id := self getComponentIdFor: aProductRelease) ifNotNil: [aProductRelease components detect: [:cmp | cmp id = id] ifNone: nil]]
getComponentIdFor: aProductRelease ^self attributesFor: aProductRelease
mergedAttributeDictionary self mergedAttributes ifNil: [self mergedAttributes: Dictionary new]. ^self mergedAttributes
mergedAttributes ^mergedAttributes
removeAttributesFor: aProductRelease self mergedAttributes notNil ifTrue: [self mergedAttributes removeKey: aProductRelease id ifAbsent: nil]
</methods> <methods> VisualWorks.MergedPackagingItem <category>inquiries</category>
instVarNamesForComparison ^super instVarNamesForComparison copyWithout: 'mergedAttributes'
</methods> <methods> VisualWorks.MergedPackagingItem <category>copying</category>
postCopy | newAttributes | super postCopy. self mergedAttributes ifNil: [^self]. newAttributes := Dictionary new. self mergedAttributes keysAndValuesDo: [:key :value | newAttributes at: key put: value copy]. self mergedAttributes: newAttributes
</methods> <methods> VisualWorks.MergedPackagingItem class <category>accessing</category>
aspectsForLiteralSpec ^#('mergedAttributes')
</methods> <methods> VisualWorks.FileAssociation <category>accessing</category>
description ^description ifNil: [description := String new]
description: aString description := aString
extension ^extension ifNil: [extension := String new]
extension: aString extension := aString
name ^name ifNil: [name := String new]
name: aString name := aString
resolveTargetWith: anObject | str replacement | str := (OrderedCollection new: 30) writeStream. self target do: [:element | | performer | performer := nil. element isSymbol ifTrue: [performer := (anObject respondsTo: element) ifTrue: [anObject] ifFalse: [(self respondsTo: element) ifTrue: [self]]]. performer ifNil: [str nextPut: element] ifNotNil: [replacement := performer perform: element. str nextPut: replacement asString]]. self target: str contents
target ^target ifNil: [target := ExpandablePath new]
target: aCollection self target newPath: aCollection
targetAsString ^self target asString
targetFromString: targetString "targetString represents a filename. Break it into component strings and verify it." | newTarget | newTarget := self pathFromString: targetString. newTarget = self target ifTrue: [^false]. self target: newTarget. ^true
</methods> <methods> VisualWorks.FileAssociation <category>printing</category>
printOn: aStream aStream nextPutAll: extension; nextPutAll: '->'; nextPutAll: self targetAsString
</methods> <methods> VisualWorks.FileAssociation <category>comparing</category>
hash ^self extension hash
</methods> <methods> VisualWorks.FileAssociation <category>api</category>
install | os | os := OSHandle currentOS. os == #win32 ifTrue: [^self installForWindows]
installForWin95: aWin95SystemSupport | nameArray tgt classesRootValue | nameArray := Array with: self name. tgt := self target asString. classesRootValue := aWin95SystemSupport HKEY_CLASSES_ROOT. aWin95SystemSupport setVariableWithRoot: classesRootValue path: nameArray key: 0 value: self description; setVariableWithRoot: classesRootValue path: nameArray key: 'EditFlags' value: 16r100; setVariableWithRoot: classesRootValue path: nameArray , #('DefaultIcon') key: 0 value: tgt , ',0'; setVariableWithRoot: classesRootValue path: nameArray , #('shell') key: 0 value: 'open'; setVariableWithRoot: classesRootValue path: nameArray , #('Shell' 'open' 'command') key: 0 value: '"' , tgt , '" %1'; setVariableWithRoot: classesRootValue path: (Array with: self extension) key: 0 value: self name
installForWindows OSSystemSupport concreteClass new installFileAssociation: self
installForWinNT: aWinNTSystemSupport | path tgt dWordTypeValue classesRootValue userRootValue currentUserRootValue | path := Array with: self name. tgt := self target asString. dWordTypeValue := aWinNTSystemSupport REG_DWORD. classesRootValue := aWinNTSystemSupport HKEY_CLASSES_ROOT. aWinNTSystemSupport setVariableWithRoot: classesRootValue path: path key: 0 value: self description; setVariableWithRoot: classesRootValue path: path key: 'BrowserFlags' value: 16r8 type: dWordTypeValue; setVariableWithRoot: classesRootValue path: path key: 'EditFlags' value: 16r0 type: dWordTypeValue; setVariableWithRoot: classesRootValue path: path , #('DefaultIcon') key: 0 value: tgt , ',0'; setVariableWithRoot: classesRootValue path: path , #('shell') key: 0 value: 'open'; setVariableWithRoot: classesRootValue path: path , #('shell' 'open' 'command') key: 0 value: '"' , tgt , '" %1'; setVariableWithRoot: classesRootValue path: (Array with: self extension) key: 0 value: self name. path := Array with: 'Applications' with: self target last with: 'shell'. aWinNTSystemSupport setVariableWithRoot: classesRootValue path: path , #('open' 'command') key: 0 value: '"' , tgt , '" %1'. path := #('.DEFAULT' 'Software' 'Microsoft' 'Windows' 'CurrentVersion' 'Explorer' 'FileExts') , (Array with: self extension asUppercase with: 'OpenWithList'). userRootValue := aWinNTSystemSupport HKEY_USERS. currentUserRootValue := aWinNTSystemSupport HKEY_CURRENT_USER. [aWinNTSystemSupport setVariableWithRoot: userRootValue path: path key: 'a' value: self target last; setVariableWithRoot: userRootValue path: path key: 'MRUList' value: 'a'] on: Error do: [:ex | userRootValue = currentUserRootValue ifTrue: [ex pass] ifFalse: [userRootValue := currentUserRootValue. path := path copyFrom: 2 to: path size. ex retry]]
</methods> <methods> VisualWorks.FileAssociation class <category>accessing</category>
aspectsForLiteralSpec ^#('name' 'description' 'extension' 'target') , super aspectsForLiteralSpec
</methods> <methods> VisualWorks.InstallerPackagerWindows <category>accessing</category>
addCommand ^addCommand ifNil: [addCommand := 'ResHacker -addoverwrite <1s>, <2s>, %<1s>' expandMacrosWith: self workingExecutable asString with: self tempExecutable asString]
tempExecutable ^tempExecutable ifNil: [tempExecutable := Filename defaultDirectory construct: 'temp.exe']
workingExecutable ^workingExecutable ifNil: [workingExecutable := Filename defaultDirectory construct: 'VWInstallerWin.exe']
workingVM ^workingVM ifNil: [workingVM := 'vwuser.exe' asFilename] ifNotNil: [workingVM]
</methods> <methods> VisualWorks.InstallerPackagerWindows <category>private</category>
addResource: aString self runCommand: (self addCommand expandMacrosWith: aString) timeout: 30. self workingExecutable delete. self tempExecutable renameTo: self workingExecutable
addStrippedImageAsResource self addResource: ('<1s>, 332,332,' expandMacrosWith: self workingImage tail)
nextSave self replaceWorkingImage: '"' , self workingExecutable asString , '"' timeout: 30
runCommand: commandString timeout: seconds | processHandle interface errorCode delay delayCount maxDelays running | processHandle := (OSSystemSupport concreteClass CreateDetachedProcess: nil arguments: commandString) memberAt: #hProcess. interface := OSSystemSupport concreteClass new. errorCode := interface DWORD gcMalloc. delay := Delay forMilliseconds: 300. delayCount := 0. maxDelays := seconds * 1000 / 300 rounded. [running := (interface GetExitCodeProcess: processHandle lpExitCode: errorCode) ~= 0 and: [errorCode contents == interface STILL_ACTIVE]. running and: [delayCount < maxDelays]] whileTrue: [delay wait]. running ifTrue: [self startImageTimeoutError]
stageSingleExeResourceFiles | dir stream result | dir := '$(VISUALWORKS)\packaging' asLogicalFileSpecification asFilename. result := WinProcess shOne: 'unzip "' , dir asString , '\win\ResHack.zip" -d .'. (dir construct: 'installer\stringtable.RES') copyTo: 'stringtable.RES'. (dir construct: 'installer\VWInstaller.ico') copyTo: 'VWInstaller.ico'. stream := 'appname.txt' asFilename writeStream. [stream nextPutAll: 'VisualWorks Installer for Windows'] ensure: [stream close]
stageSingleExeSourceFiles IShellInterface libraryFiles: #('ole32.dll' 'oleaut32.dll'). self createWorkingImage. IShellInterface libraryFiles: #('ole32.dll' 'oleaut32.dll' 'linkmaster.dll'). self workingVM copyTo: self workingExecutable
</methods> <methods> VisualWorks.InstallerPackagerWindows <category>package single executable</category>
packageSingleExecutableForWindows | filesToKeep | filesToKeep := (Filename defaultDirectory filenamesMatching: '*') add: self workingExecutable; add: (Filename defaultDirectory construct: 'error.log'); yourself. [self stageSingleExeSourceFiles; stageSingleExeResourceFiles; startThreeStepStrip; compressImage: self workingImage; addStrippedImageAsResource; addResource: 'VWInstaller.ico, icon,323,1'; addResource: 'appname.txt, 325,325,'; nextSave; compressImage: self workingImage; addStrippedImageAsResource; nextSave; compressImage: self workingImage; addStrippedImageAsResource; addResource: 'stringtable.RES,,,'] on: AbortPackaging do: [:ex | ^self]. Filename defaultDirectory deleteAllExcept: filesToKeep. [Transcript cr; show: self workingExecutable asString; show: ' created'] forkAt: Processor userBackgroundPriority
</methods> <methods> VisualWorks.InstallMap <category>accessing</category>
applicationName | stringOrNil | stringOrNil := self dynamicAttributes at: #applicationName ifAbsent: nil. ^(stringOrNil isNil or: [stringOrNil isEmpty]) ifTrue: [super applicationName] ifFalse: [stringOrNil]
applicationName: aStringOrNil ^self dynamicAttributes at: #applicationName put: (aStringOrNil ifNil: [String new])
applicationVersion ^self dynamicAttributes at: #applicationVersion ifAbsent: [String new]
attributeNamed: key ifAbsent: anEvaluableObject ^self dynamicAttributes at: key ifAbsent: anEvaluableObject
creationTimestamp ^self dynamicAttributes at: #creationTimestamp ifAbsent: nil
dynamicAttributes ^dynamicAttributes ifNil: [dynamicAttributes := Dictionary new]
dynamicAttributes: aDictionaryOrString dynamicAttributes := aDictionaryOrString isString ifTrue: [Object readFromString: aDictionaryOrString] ifFalse: [aDictionaryOrString]
fullName | nameString versionString | nameString := self applicationName. versionString := self applicationVersion. ^((nameString notNil and: [nameString notEmpty and: [versionString notEmpty]]) ifTrue: [#fullNameTemplate << #installer >> '<1s> <2s>'] ifFalse: [#nameTemplate << #installer >> '<1s><2s>']) expandMacrosWith: nameString with: versionString
license ^self dynamicAttributes at: #license ifAbsent: nil
license: aString self dynamicAttributes at: #license put: aString
licenseAccepted ^licenseAccepted
licenseAccepted: aBoolean licenseAccepted := aBoolean
location: aFileOrURI aFileOrURI isURI ifTrue: [aFileOrURI passiveMode: self class usePassiveFTP; ensureInstallerLogin]. location := aFileOrURI
mapVersion ^self dynamicAttributes at: #mapVersion ifAbsent: nil
requestRegistration ^self dynamicAttributes at: #requestRegistration ifAbsent: false
requiresKey ^self dynamicAttributes at: #requiresKey ifAbsent: false
variablePath ^self attributeNamed: #variablePath ifAbsent: [Win95SystemSupport currentVersion]
vmComponentForByte: anInteger | value vmCmpName | value := self dynamicAttributes at: anInteger ifAbsent: [^nil]. "Backward compatability - older file formats used a string and newer formats use a collection whose first element is the VM component name." vmCmpName := value isString ifTrue: [value] ifFalse: [value first]. ^self components detect: [:cmp | cmp name = vmCmpName] ifNone: nil
</methods> <methods> VisualWorks.InstallMap <category>private</category>
ensureFileScanInBackground: aBoolean "Some clients fork this method at a higher priority to ensure the critical block is entered as soon as possible. Once in the critical block, the priority should drop to let the calling process continue. If aBoolean is true, drop the priority. Otherwise assume this call was not forked, and do not alter the priority." [self readStateSemaphore critical: [aBoolean ifTrue: [Processor activeProcess priority: Processor userBackgroundPriority. Processor yield]. [self fromLiteralArrayEncoding: (Object readFromString: self location contentsOfEntireFile asString). self setReadState. self isInitialized ifTrue: [self ensureApplicationName]] on: RemoteExceptions do: [:ex | self readState: #error. ex return: nil]]] ensure: [self changed: #status with: self readState. scanProcess := nil]
readState ^self readStateSemaphore critical: [self readStateNow]
readState: aSymbol ^readState := aSymbol
readStateNow ^readState
readStateSemaphore ^readStateSemaphore ifNil: [readStateSemaphore := Semaphore forMutualExclusion]
</methods> <methods> VisualWorks.InstallMap <category>testing</category>
errorEncountered ^self readStateNow = #error
exists ^self isInitialized or: [[self location exists] on: RemoteExceptions do: [:ex | false]]
forInstall ^true
isInitialized ^self readStateNow = #initialized
isRemote ^self location isURI
requiresLicense self readState. ^self license notNil
scanning ^scanProcess notNil
</methods> <methods> VisualWorks.InstallMap <category>printing</category>
displayString ^self fullName
displayStringTemplate ^#displayStringTemplateExpanded << #installer >> '<1s> (<2s>%<1s%>)' expandMacrosWith: self fullName with: (self location isURI ifTrue: [#ftp << #installer >> 'ftp'] ifFalse: [#CD << #installer >> 'CD'])
printOn: aStream aStream nextPutAll: self fullName
</methods> <methods> VisualWorks.InstallMap <category>initialize-release</category>
ensureApplicationName | nameString | ((nameString := self applicationName) isNil or: [nameString isEmpty or: [nameString = ' ']]) ifFalse: [^self]. self error: (#applicationNameNotFound << #installer >> 'Application name not found')
forkEnsureFileScan "If scan already in progress or receiver already initialized, do nothing. Else, start the read in a forked process." self scanning ifTrue: [^self]. self readStateNow ifNotNil: [:symbol | symbol == #error ifFalse: [^self]]. scanProcess := [self ensureFileScanInBackground: true] forkAt: Processor userSchedulingPriority + 1
setReadState ^self readState: ((self components isNil or: [self components isEmpty or: [self components first archive isEmpty]]) ifTrue: [#error] ifFalse: [#initialized])
terminateScan scanProcess ifNotNil: [:process | process terminate. scanProcess := nil]
</methods> <methods> VisualWorks.InstallMap <category>updating</category>
waitForUpdates | delay | delay := Delay forMilliseconds: 100. Cursor wait showWhile: [[self scanning] whileTrue: [delay wait]]
</methods> <methods> VisualWorks.InstallMap <category>inquiries</category>
defaultSelections ^(super defaultSelections asSet) addAll: self vmComponentsForPlatform; yourself
defaultVMComponent ^self vmComponentForByte: ObjectMemory platformByte
nonVMComponents ^self components reject: [:cmp | 'VM *' match: cmp name]
vmComponentsForPlatform | vmCmps | vmCmps := Set with: self defaultVMComponent. (OSHandle platformMoniker == #linux86 and: ['x86_64*' match: (UnixProcess shOne: '/bin/uname -m')]) ifTrue: [vmCmps add: (self vmComponentForByte: 64)]. (OSHandle platformMoniker == #solaris and: ['64*' match: (UnixProcess shOne: '/bin/isainfo -b')]) ifTrue: [vmCmps add: (self vmComponentForByte: 65)]. (OSHandle platformMoniker == #solaris86 and: ['64*' match: (UnixProcess shOne: '/bin/isainfo -b')]) ifTrue: [vmCmps add: (self vmComponentForByte: 66)]. "For any Mac PPC platform, select all Mac PPC VMs." (#(32 39 46) includes: ObjectMemory platformByte) ifTrue: [vmCmps addAll: (#(32 39 46) collect: [:byte | self vmComponentForByte: byte])]. "For any Mac Intel platform, select all Mac Intel VMs." (#(52 53) includes: ObjectMemory platformByte) ifTrue: [vmCmps addAll: (#(52 53) collect: [:byte | self vmComponentForByte: byte])]. ^vmCmps
</methods> <methods> VisualWorks.InstallMap class <category>defaults</category>
defaultLocationTail ^'install.map'
</methods> <methods> VisualWorks.InstallMap class <category>accessing</category>
usePassiveFTP ^UsePassiveFTP
usePassiveFTP: aBoolean UsePassiveFTP := aBoolean
</methods> <methods> VisualWorks.InstallMap class <category>deployment</category>
dynamicallyReferencedSelectors ^#(#licenseAccepted:)
</methods> <methods> VisualWorks.InstallMap class <category>instance creation</category>
from: aString ^self from: aString named: nil
from: aString named: aStringOrNil ^self on: (self locationFromString: aString) named: aStringOrNil
on: aFile ^self on: aFile named: nil for: nil
on: aFile for: anObject ^self on: aFile named: nil for: anObject
on: aFile named: aStringOrNil ^self on: aFile named: aStringOrNil for: nil
on: aFile named: aStringOrNil for: anObject ^(self new) addDependent: anObject; location: aFile; applicationName: aStringOrNil; yourself
</methods> <methods> VisualWorks.InstallMap class <category>utility</category>
locationFromString: aString | file | file := aString asRemoteOrLocalFile. (file isURI not and: [file isRelative]) ifTrue: [file := (Filename components: file asResolvedString) inject: Filename defaultDirectory into: [:dir :path | dir construct: path]]. ^file
</methods> <methods> VisualWorks.UninstallerPage <category>private</category>
anySkipped: aDirectory ^ [(aDirectory filenamesMatching: '*') noneSatisfy: [:fileName | fileName isDirectory ifTrue: [self anySkipped: fileName] ifFalse: [skippedFiles includes: fileName]]] on: OsInaccessibleError do: [:ex | ex return: true]
deleteDirectory: aDirectory [aDirectory delete] on: OSErrorHolder errorSignal do: [:ex | ^false]. ^aDirectory exists not
deleteDirectoryTree: aDirectory (aDirectory filenamesMatching: '*') do: [:fn | fn isDirectory ifTrue: [self deleteDirectoryTree: fn] ifFalse: [self deleteFile: fn]]. ^self deleteDirectory: aDirectory
deleteFile: aFilename "Try to delete aFilename, if there was success then return true, otherwise return false." ^ [[aFilename setWritable: true. aFilename delete. true] on: OSErrorHolder nonexistentSignal do: [:ex | true]] on: Error do: [:ex2 | false]
generateText ^#uninstallTextTemplate << #installer >> '<nn><1s> files are now being removed from your system.' expandMacrosWith: self parent seedLog value printString
notifyUnremoved | message unremoved | (unremoved := SortedCollection sortBlock: [:f1 :f2 | f1 asString <= f2 asString]) addAll: unremovableFiles; addAll: unremovableDirectories; addAll: skippedFiles; addAll: skippedDirectories. unremoved isEmpty ifTrue: [^self]. (message := String new writeStream) nextPutAll: (#notRemovedPrompt << #installer >> 'The following were not removed:<n>') expandMacros. unremoved do: [:filename | message nextPutAll: filename asString] separatedBy: [message cr]. self parent isHeadless ifFalse: [self parent doNowInUIProcess: [Dialog report: message contents]]. (self parent stdout) cr; nextPutAll: message contents; cr
pageTitleText ^(#Uninstalling << #installer >> '<bl>Uninstalling') expandMacros
preUninstall self parent disableInitialScreens: 0. self setPolicies. skippedDirectories := Set new. skippedFiles := Set new. unremovableDirectories := Set new. unremovableFiles := Set new. totalToRemove := self parent components selections inject: 0 into: [:total :cmp | total + cmp startItems size + cmp files size]. tempRemoved := removedSoFar := 0. progressIncrement := (totalToRemove / 100) ceiling
removeDirectory: aDirectory | deleted | deleted := self deleteDirectory: aDirectory. deleted ifTrue: [self removed: aDirectory]. ^deleted
removeDirectoryTree: aDirectory | contents | (skippedDirectories includes: aDirectory) ifTrue: [^false]. aDirectory exists ifFalse: [^true]. contents := aDirectory directoryContents. contents isEmpty ifTrue: [^self removeDirectory: aDirectory]. self removeNonEmptyDirectoryPolicy value = #skipAll ifTrue: [^false]. aDirectory directoryContents do: [:fileString | | filename | filename := aDirectory construct: fileString. filename isDirectory ifTrue: [self removeDirectoryTree: filename] ifFalse: [(unremovableFiles includes: filename) ifTrue: [(self deleteFile: filename) ifTrue: [unremovableFiles remove: filename ifAbsent: [nil]]] ifFalse: [(self shouldRemoveNonEmptyDirectory: aDirectory) ifTrue: [(self deleteFile: filename) ifTrue: [unremovableFiles remove: filename ifAbsent: [nil]]] ifFalse: [unremovableDirectories remove: aDirectory ifAbsent: [nil]. self skipDirectory: aDirectory. ^false]]]]. ^self removeDirectory: aDirectory
removeFile: aFilename | deleted | deleted := self deleteFile: aFilename. deleted ifTrue: [self removed: aFilename] ifFalse: [unremovableFiles add: aFilename]. ^deleted
removeRemainingFilesAndDirectories self uninstallComponent: self parent seedLog value unnamedComponent. unremovableDirectories copy do: [:directory | (self removeDirectoryTree: directory) ifTrue: [unremovableDirectories remove: directory]]. self removeFile: self parent seedLog value location
setPolicies | policy | self parent isInteractive ifTrue: [^self]. policy := self parent force ifTrue: [#removeAll] ifFalse: [#skipAll]. self removeModifiedFilePolicy value: policy. self removeNonEmptyDirectoryPolicy value: policy
uninstallComponent: aComponentLog | items | self parent doInUIProcess: [self component value: aComponentLog name]. (items := aComponentLog startItems) copy reverseDo: [:startItem | (self uninstallStartItem: startItem) ifTrue: [items remove: startItem]]. (items := aComponentLog files) copy reverseDo: [:fileArray | (self uninstallFileOrDirectory: fileArray) ifTrue: [items remove: fileArray]]. (items := aComponentLog environmentItems) copy reverseDo: [:variableName | (self uninstallVariableName: variableName) ifTrue: [items remove: variableName]]. aComponentLog isEmpty ifTrue: [self parent seedLog value removeComponent: aComponentLog]
uninstallDirectory: aDirectory (self removeDirectory: aDirectory) ifTrue: [^true]. aDirectory directoryContents isEmpty ifTrue: [unremovableDirectories add: aDirectory. ^true]. self ignorePolicies ifTrue: [^false]. (self removeNonEmptyDirectoryPolicy value = #skipAll or: [self anySkipped: aDirectory]) ifTrue: [^self skipDirectory: aDirectory]. ^(self shouldRemoveNonEmptyDirectory: aDirectory) ifTrue: [self removeDirectoryTree: aDirectory] ifFalse: [self skipDirectory: aDirectory]
uninstallFile: aFilename size: anInteger timestamp: aTimestamp | unchanged | unchanged := aFilename matchesSize: anInteger andTimestamp: aTimestamp. (unchanged or: [self removeModifiedFilePolicy value = #removeAll or: [self ignorePolicies not]]) ifFalse: [^false]. ^(unchanged or: [self shouldRemoveModifiedFile: aFilename]) ifTrue: [self removeFile: aFilename] ifFalse: [self skipFile: aFilename]
uninstallFileOrDirectory: fileArray | filename | (filename := fileArray first asFilename) exists ifFalse: [^self removed: filename]. ^filename isDirectory ifTrue: [self uninstallDirectory: filename] ifFalse: [self removeModifiedFilePolicy value = #removeAll ifTrue: [self removeFile: filename] ifFalse: [self uninstallFile: filename size: (fileArray at: 2) timestamp: ((Locale named: #C) readTimestampFrom: fileArray last readStream)]]
uninstallStartItem: startItem ^true
uninstallVariableName: variableName "This is broken on Windows for the case where the uninstaller image is not from the same build as the build being removed, since the wrong key is removed. I think it is safer for now to just leave the value in the registry, until it is arranged that the value in the log file explicitly identifies its path in the registry." "OSHandle currentOS == #win32 ifTrue: [(Win95SystemSupport new) removeVariable: variableName ifAbsent: nil]" ^true
updateLog "Move unremoveable things to unnamedComponent and save log" | log cmp | log := self parent seedLog value. cmp := log unnamedComponent. skippedDirectories do: [:dir | cmp logDirectory: dir]. cmp files addAll: (skippedFiles collect: [:file | file asString]). log dirty: true; save
</methods> <methods> VisualWorks.UninstallerPage <category>accessing</category>
ignorePolicies ^ignorePolicies
ignorePolicies: aBoolean ignorePolicies := aBoolean
removeModifiedFilePolicy ^removeModifiedFilePolicy ifNil: [removeModifiedFilePolicy := ValueHolder new]
removeNonEmptyDirectoryPolicy ^removeNonEmptyDirectoryPolicy ifNil: [removeNonEmptyDirectoryPolicy := ValueHolder new]
shouldRemoveModifiedFile: aFilename | policy | ^(policy := self removeModifiedFilePolicy value) = #removeAll or: [policy ~= #skipAll and: ['remove*' match: (self removeModifiedFileDialog: aFilename)]]
shouldRemoveNonEmptyDirectory: aDirectory | policy | ^(policy := self removeNonEmptyDirectoryPolicy value) = #removeAll or: [policy ~= #skipAll and: ['remove*' match: (self removeNonEmptyDirectoryDialog: aDirectory)]]
workProcess ^workProcess
workProcess: aProcess aProcess ifNotNil: [aProcess name: 'uninstall process']. workProcess := aProcess
workSemaphore ^workSemaphore ifNil: [workSemaphore := Semaphore new]
</methods> <methods> VisualWorks.UninstallerPage <category>interface opening</category>
postBuildWith: aBuilder super postBuildWith: aBuilder. (self widgetAt: #componentName) ifNotNil: [:editor | editor controller: Controller new]
postOpenWith: aBuilder super postOpenWith: aBuilder. self uninstall
</methods> <methods> VisualWorks.UninstallerPage <category>testing</category>
isActionPage ^true
</methods> <methods> VisualWorks.UninstallerPage <category>updating</category>
removed: aFilename tempRemoved := tempRemoved + 1. tempRemoved < progressIncrement ifTrue: [^true]. removedSoFar := removedSoFar + tempRemoved. tempRemoved := 0. self parent doInUIProcess: [self totalProgress value: (totalToRemove = 0 ifTrue: [1] ifFalse: [removedSoFar / totalToRemove])]. ^true
skipDirectory: aDirectory skippedDirectories add: aDirectory. self removed: aDirectory. ^false
skipFile: aFilename skippedFiles add: aFilename. self removed: aFilename. ^false
</methods> <methods> VisualWorks.UninstallerPage <category>dialogs</category>
removeModifiedFileDialog: aFilename self parent doNowInUIProcess: [Tools.RemoveModifiedFileDialog for: aFilename model: self removeModifiedFilePolicy]. self removeModifiedFilePolicy value ifNil: [UserAbort signalWith: aFilename]. ^self removeModifiedFilePolicy value
removeNonEmptyDirectoryDialog: aDirectory self parent doNowInUIProcess: [Tools.RemoveNonEmptyDirectoryDialog for: aDirectory model: self removeNonEmptyDirectoryPolicy]. self removeNonEmptyDirectoryPolicy value ifNil: [UserAbort signalWith: aDirectory]. ^self removeNonEmptyDirectoryPolicy value
</methods> <methods> VisualWorks.UninstallerPage <category>uninstalling</category>
finishWork self workProcess ifNotNil: [self workSemaphore wait]
runHeadless self uninstall. [self workSemaphore wait] ensure: [self parent quit]
uninstall | selections | (selections := self parent components selections) isEmpty ifTrue: [self defaultAction]. self preUninstall. self workProcess: ( [ [self ignorePolicies: true. selections reverseDo: [:cmp | self uninstallComponent: cmp]. self ignorePolicies: false. selections reverseDo: [:cmp | self uninstallComponent: cmp]. self parent seedLog value components isEmpty ifTrue: [self removeRemainingFilesAndDirectories] ifFalse: [self updateLog]. self workProcess: nil. self parent doNowInUIProcess: [self defaultAction]] ensure: [self notifyUnremoved. self workSemaphore signal]] forkAt: Processor userSchedulingPriority - 2)
</methods> <methods> VisualWorks.UninstallerPage <category>aspects</category>
component ^component ifNil: [component := String new asValue]
totalProgress ^totalProgress ifNil: [totalProgress := 0.0 asValue]
</methods> <methods> VisualWorks.SummaryPage <category>private</category>
componentSummaryText | beVerbose components selections stream | beVerbose := self verbose. components := beVerbose ifTrue: [self parent components list] ifFalse: [self parent components selections]. selections := self parent components selections. stream := String new writeStream. stream nextPutAll: (#numberOfComponentsSelected << #installer >> '<1p> of <2p> components selected (<3s>):' expandMacrosWith: selections size with: self parent components list size with: self parent bytesRequired printAsDiskSpace). components do: [:component | stream nextPutAll: (#componentSummaryTemplate << #installer >> '<n><1s><t><2s> <t>(<3s>)' expandMacrosWith: ((beVerbose and: [selections includes: component]) ifTrue: ['>'] ifFalse: [String new]) with: component name with: component currentSize printAsDiskSpace)]. ^stream contents
generateText self scrollTextToBottom: false. self parent ensureOptions. self parent undecided ifTrue: [^self undecidedText]. ^self parent forInstall ifTrue: [self installText] ifFalse: [self uninstallText]
installerStatus ^self parent serverChecked value ifTrue: [(self parent updateAvailable and: [self parent updateApplied value not]) ifTrue: [#updateAvailable << #installer >> 'Installer update available.'] ifFalse: [#upToDate << #installer >> 'Installer is up to date.']] ifFalse: [#notScanned << #installer >> 'Server not scanned.']
installText ^#summaryTextInstall << #installer >> '<1s><n>Install <2p><nt>from <3s><nt>to <4s><5s><n><6s>' expandMacrosWithArguments: ((OrderedCollection new) add: self installerStatus; add: self parent seedFile; add: (self parent displayStringForLocation: (self parent seedFile ifNotNil: [:seed | seed location])); add: self parent tgtString; add: self licenseSummary; add: self componentSummaryText; yourself)
licenseSummary | value | self parent seedFile requiresLicense ifFalse: [^String new]. value := self parent seedFile licenseAccepted. ^((value notNil and: [value]) ifTrue: [#licenseAccepted << #installer >> '<n>License accepted.'] ifFalse: [#licenseNotAccepted << #installer >> '<n>License not accepted.']) expandMacros
pageTitleText ^(#InstallationOptionsSummary << #installer >> '<bl>Installation Options Summary') expandMacros
policyText ^self parent force ifTrue: [(#forceRemovalText << #installer >> '<n>Force removal of modified files and non-empty directories.') expandMacros] ifFalse: [String new]
undecidedText ^#summaryTextUndecided << #installer >> '<1s><n>No action selected.' expandMacrosWith: self installerStatus
uninstallText ^#summaryTextUninstall << #installer >> '<1s><n>Uninstall <2p><nt>from <3s><4s><n><5s>' expandMacrosWithArguments: ((OrderedCollection new) add: self installerStatus; add: self parent seedFile; add: (self parent displayStringForLocation: (self parent seedFile ifNotNil: [:seed | seed location])); add: self policyText; add: self componentSummaryText; yourself)
verboseText self verbose: true. ^self generateText
</methods> <methods> VisualWorks.SummaryPage <category>synchronization</category>
okToSkip ^false
</methods> <methods> VisualWorks.SummaryPage <category>accessing</category>
verbose ^verbose ifNil: [false]
verbose: aBoolean verbose := aBoolean
</methods> <methods> VisualWorks.SummaryPage <category>actions</category>
saveOptions self parent saveOptions
</methods> <methods> VisualWorks.SummaryPage <category>interface opening</category>
postBuildWith: aBuilder self parent seedFile waitForUpdates. self parent processOutstandingEvents. super postBuildWith: aBuilder
</methods> <methods> VisualWorks.ComponentLog <category>comparing</category>
<= aComponentLog ^self name <= aComponentLog name
hash ^self name hash
</methods> <methods> VisualWorks.ComponentLog <category>accessing</category>
description ^description ifNil: [description := String new]
description: aString description := aString
environmentItems ^environmentItems ifNil: [environmentItems := OrderedCollection new]
environmentItems: aCollection environmentItems := aCollection asOrderedCollection
fileAssociations ^fileAssociations ifNil: [fileAssociations := OrderedCollection new]
fileAssociations: aCollection fileAssociations := aCollection asOrderedCollection
files ^files ifNil: [files := OrderedCollection new]
files: aCollection files := aCollection asOrderedCollection
name ^name
name: anObject name := anObject
startItems ^startItems ifNil: [startItems := OrderedCollection new]
startItems: aCollection startItems := aCollection asOrderedCollection
</methods> <methods> VisualWorks.ComponentLog <category>logging</category>
logDirectory: aFilename | dirString dirArray | dirString := aFilename asString copy. dirString isImmutable: true. dirArray := Array with: dirString. dirArray isImmutable: true. self files add: dirArray
logFile: aFilename size: anInteger time: aTimestamp | fileString timestamp fileArray | fileString := aFilename asString copy. fileString isImmutable: true. timestamp := ((Locale named: #C) printAsTime: aTimestamp policyNamed: #short) asString. timestamp isImmutable: true. fileArray := Array with: fileString with: anInteger with: timestamp. fileArray isImmutable: true. self files add: fileArray
logVariable: aVariableMap self environmentItems add: aVariableMap name
</methods> <methods> VisualWorks.ComponentLog <category>initialize-release</category>
fromComponentLog: aComponentLog self == aComponentLog ifTrue: [^self]. self name: aComponentLog name; environmentItems: aComponentLog environmentItems; fileAssociations: aComponentLog fileAssociations; files: aComponentLog files; startItems: aComponentLog startItems
updateWith: aComponentLog aComponentLog == self ifTrue: [^self]. self description: aComponentLog description. self environmentItems: ((self environmentItems asSet) addAll: aComponentLog environmentItems; yourself) asOrderedCollection. self files addAll: aComponentLog files
</methods> <methods> VisualWorks.ComponentLog <category>converting</category>
environmentItemsAsLiteral ^self environmentItems asArray
fileAssociationsAsLiteral ^self fileAssociations asArray
filesAsLiteral ^self files asArray
startItemsAsLiteral ^self startItems asArray
</methods> <methods> VisualWorks.ComponentLog <category>inquiries</category>
selectByDefault ^false
</methods> <methods> VisualWorks.ComponentLog <category>printing</category>
currentSize ^self files inject: 0 into: [:subtotal :fileArray | subtotal + (fileArray size = 1 ifTrue: [0] ifFalse: [fileArray at: 2])]
printOn: aStream (self name isNil or: [self name isEmpty]) ifTrue: [^super printOn: aStream]. aStream nextPutAll: self name
</methods> <methods> VisualWorks.ComponentLog <category>compatability</category>
fileMaps: aCollection self files: aCollection
prereqs ^Array new
</methods> <methods> VisualWorks.ComponentLog <category>testing</category>
isEmpty ^self startItems isEmpty and: [self files isEmpty and: [self environmentItems isEmpty]]
</methods> <methods> VisualWorks.ComponentLog class <category>accessing</category>
aspectsForLiteralSpec ^#('name' 'description' 'environmentItems' 'fileAssociations' 'startItems' 'fileIndexes' 'files')
conversionSelectorsFromLiteralArray ^#(#name: #description: #environmentItems: #fileAssociations: #files: #startItems:)
conversionSelectorsToLiteralArray ^#(#name #description #environmentItemsAsLiteral #fileAssociationsAsLiteral #filesAsLiteral #startItemsAsLiteral)
</methods> <methods> Tools.RemoveModifiedFileDialog <category>actions</category>
remove self resultHolder value: (self applyToAll value ifTrue: [#removeAll] ifFalse: [#remove]). self accept value: true
skip self resultHolder value: (self applyToAll value ifTrue: [#skipAll] ifFalse: [#skip]). self accept value: true
</methods> <methods> Tools.RemoveModifiedFileDialog <category>initialize-release</category>
setMessageFor: aFilenameOrString self message value: (#removeModifiedFileDialog << #installer >> 'The following file has been modified:<nt><1s><n>Remove it?' expandMacrosWith: aFilenameOrString asString)
</methods> <methods> VisualWorks.ProductComponent <category>accessing</category>
archive ^archive ifNil: [archive := ExpandablePath new]
archive: aCollection self archive newPath: aCollection
currentSize ^self sizes inject: 0 into: [:subTotal :size | subTotal + size]
description ^description ifNil: [description := String new]
description: aString description := aString
environmentItems ^environmentItems ifNil: [environmentItems := List new]
environmentItems: aCollection environmentItems := aCollection asList
fileAssociations ^fileAssociations ifNil: [fileAssociations := List new]
fileAssociations: aCollection fileAssociations := aCollection asList
id ^id
id: anInteger id := anInteger
name ^name ifNil: [name := String new]
name: aString name := aString
prereqs ^prereqs ifNil: [prereqs := List new]
prereqs: strings prereqs := (strings isKindOf: List) ifTrue: [strings] ifFalse: [strings asList]
selectByDefault ^selectByDefault ifNil: [selectByDefault := false]
selectByDefault: aBoolean selectByDefault := aBoolean
sizeCompressed ^sizeCompressed ifNil: [sizeCompressed := 0]
sizeCompressed: anInteger sizeCompressed := anInteger
sizes ^sizes ifNil: [sizes := OrderedCollection new]
sizes: aCollection sizes := aCollection
startItems ^startItems ifNil: [startItems := List new]
startItems: aCollection startItems := aCollection asList
target ^target
target: aCollection target := aCollection
</methods> <methods> VisualWorks.ProductComponent <category>printing</category>
instVarNamesForInstall ^#('name' 'archive' 'prereqs' 'target' 'selectByDefault' 'description' 'environmentItems' 'startItems' 'fileAssociations' 'sizeCompressed' 'sizes')
printOn: aStream aStream nextPutAll: self name
</methods> <methods> VisualWorks.ProductComponent <category>private - backward compatability</category>
fromVersion2LiteralArrayEncoding: anArray 2 to: anArray size by: 2 do: [:index | self perform: (anArray at: index) with: (5 < index ifFalse: [anArray at: index + 1] ifTrue: [((anArray at: index + 1) collect: [:subArray | subArray first asQualifiedReference value decodeFromVersion2LiteralArray: subArray]) asList])]
</methods> <methods> VisualWorks.ProductComponent <category>comparing</category>
< aProductComponent ^self id < aProductComponent id
<= aProductComponent ^(self id isNil or: [aProductComponent id isNil]) ifTrue: [self name <= aProductComponent name] ifFalse: [self id <= aProductComponent id]
= aProductComponent ^self class == aProductComponent class and: [self id = aProductComponent id and: [self name = aProductComponent name and: [self selectByDefault = aProductComponent selectByDefault and: [self target = aProductComponent target]]]]
hash ^self id hash
</methods> <methods> VisualWorks.ProductComponent <category>backward compatability</category>
installByDefault: aBoolean self selectByDefault: aBoolean
path: aCollection self archive newPath: aCollection
</methods> <methods> VisualWorks.ProductComponent <category>inquiries</category>
archiveRelativeTo: aDirectory ^self archive inject: aDirectory into: [:dir :cmp | dir construct: cmp]
</methods> <methods> VisualWorks.ProductComponent <category>copying</category>
postCopy super postCopy. archive := self archive copy
</methods> <methods> VisualWorks.ProductComponent class <category>deployment</category>
dynamicallyReferencedClasses ^#(#EnvironmentItem #StartItem)
dynamicallyReferencedSelectors ^#(#archive: #environmentItems: #fileMaps: #installByDefault: #name: #selectByDefault: #sizes: #startItems:)
</methods> <methods> VisualWorks.ProductComponent class <category>accessing</category>
aspectsForLiteralSpec ^#('id' 'name' 'description' 'selectByDefault' 'target' 'archive' 'prereqs')
</methods> <methods> VisualWorks.InstallerPackagerPowermac <category>package</category>
packageArchiveForPowermac "self packageArchiveForPowermac" | srcDir | [self packagingDirectory: 'VWInstallerPowermac' asFilename. srcDir := (self engineForPlatformByte: 32) directory. self initializePackagingDirectoryWithAll: (Array with: (srcDir construct: 'NetManage WinSock Lib.bin') with: (srcDir construct: 'StdCLib.bin') with: (srcDir construct: 'visual.bin') with: self workingImage). UnixProcess shOne: ('stuff -n=VWInstallerPowermac.sit -f=sit5 <1s>' expandMacrosWith: self packagingDirectory asString). self packagingDirectory deleteTreeForced. Transcript cr; show: 'VWInstallerPowermac.sit created'] on: AbortPackaging do: [:ex | ]. self packagingDirectory: nil
</methods> <methods> VisualWorks.InstallerSAXDriver <category>accessing</category>
configuration ^configuration
configuration: aDictionary configuration := aDictionary
key ^key
key: anObject key := anObject
newParser ^XMLParser new
</methods> <methods> VisualWorks.InstallerSAXDriver <category>content handler</category>
characters: aString | value | self key ifNil: [^self]. value := String readFromString: aString. value isEmpty ifTrue: [^self]. value first = $# ifTrue: [(self configuration at: self key ifAbsentPut: [OrderedCollection new]) addAll: (Array readFromString: value)] ifFalse: [self configuration at: self key put: value]
endElement: namespaceURI localName: localName qName: name self key: nil
startElement: nsURI localName: lName qName: name attributes: attrList self key: name
</methods> <methods> VisualWorks.InstallerSAXDriver <category>private</category>
noop: aString ^self
</methods> <methods> VisualWorks.InstallerSAXDriver class <category>instance creation</category>
configuration: aDictionary ^(self new) configuration: aDictionary; yourself
for: anObject ^(self new) client: anObject; yourself
</methods> <methods> VisualWorks.SeedFileDialog <category>initialize-release</category>
newSeedString: aValueModel newSeedString := aValueModel
</methods> <methods> VisualWorks.SeedFileDialog <category>actions</category>
accept ^super accept value: true
browseForSeed | dialog file | dialog := OpenFileDialog new. dialog addFilterForAllFiles. dialog addFileFilter: self pattern key pattern: self pattern value. dialog setFileFilterMatching: self pattern value. dialog fileCondition: #mustBeOld. dialog parentWindow: self mainWindow. file := self newSeedString value asRemoteOrLocalFile. (file notNil and: [file isURI not]) ifTrue: [dialog defaultFilename: file]. dialog open ifTrue: [self newSeedString value: dialog selectionString]
cancel ^super cancel value: true
</methods> <methods> VisualWorks.SeedFileDialog <category>aspects</category>
newSeedString ^newSeedString isNil ifTrue: [newSeedString := String new asValue] ifFalse: [newSeedString]
prompt ^prompt ifNil: [prompt := String new asValue]
</methods> <methods> VisualWorks.SeedFileDialog <category>accessing</category>
pattern ^pattern
pattern: anAssociation pattern := anAssociation
</methods> <methods> VisualWorks.SeedFileDialog class <category>interface opening</category>
request: promptString initialAnswer: answerString pattern: pattern | model dialog | dialog := self new. dialog prompt value: promptString. model := answerString asValue. dialog newSeedString: model. dialog pattern: pattern. ^(self openOn: dialog) ifTrue: [model value] ifFalse: [String new]
</methods> <methods> VisualWorks.SeedFileDialog class <category>resource accessing</category>
browseForSeedIcon ^ToolbarIconLibrary visualFor: #fileBrowser
</methods> <methods> VisualWorks.InstallerPage <category>private-installing</category>
installComponents: components self installVariablesFrom: components; installFilesFrom: components; installStartItemsFrom: components; installFileAssociationsFrom: components
installFileAssociation: aFileAssociation aFileAssociation resolveTargetWith: self parent; install
installFileAssociationsFrom: components | itemsByCmp | (itemsByCmp := self items: #fileAssociations from: components) isEmpty ifTrue: [^self]. self updateTargetFile: #settingUpFileAssociations << #installer >> 'Setting up file associations...'. self installItems: itemsByCmp selector: #installFileAssociation:
installFilesFrom: components components do: [:cmp | self currentComponent: cmp. (self parent perform: cmp target) ifNotNil: [:tgtDir | self log currentComponentName: cmp name. self preInstallComponent: cmp. self installFilesFrom: (cmp archiveRelativeTo: self parent installSource) to: tgtDir. self postInstallComponent: cmp]]
installFilesFrom: anArchive to: aDirectory anArchive isURI ifTrue: [self installFilesFromRemoteArchive: anArchive to: aDirectory] ifFalse: [self installFilesFromLocalArchive: anArchive to: aDirectory]
installFilesFromLocalArchive: aFilename to: aDirectory (self parent checkExistsWithNotReadyRetry: aFilename) ifFalse: [self sourceArchiveDoesNotExist: aFilename]. [self archiver extractArchive: aFilename to: aDirectory notifying: self] on: UserAbort do: [:ex | self installCancelledDialog. self abortInstallationWithoutConfirmation]
installFilesFromRemoteArchive: anFtpURL to: aDirectory | unzipStream ftpStream totalProgressCount overwritePolicy | ftpStream := nil. self totalProgress flush. totalProgressCount := self totalProgress count. overwritePolicy := #unknown. [[anFtpURL readStreamDo: [:stream :context | ftpStream := stream. ftpStream expectedSize: self currentComponent sizeCompressed. unzipStream := OS.ZLib.GZipReadStream on: ftpStream. [self archiver untarStream: unzipStream to: aDirectory notifying: self] ensure: [[unzipStream close] on: Error do: [:ex | ex return]]]] on: RemoteExceptions , CantReopenError , UserAbort do: [:ex | ex class = UserAbort ifTrue: [self installCancelledDialog. self abortInstallationWithoutConfirmation]. self checkRetry: ex. ftpStream ifNil: [ex retry]. [ftpStream restoreFromURL: anFtpURL] on: RemoteExceptions do: [:ex2 | ]. self updateTargetFile. ex retry]] on: OS.ZLib.ZLibBufferError , CannotResumeError do: [:ex | self checkRetry: ex. overwritePolicy := self archiver overwritePolicy. self archiver overwritePolicy: #overwriteAll. self componentProgress initializeValueWith: self componentProgress maxCount. self totalProgress setCount: totalProgressCount. self totalProgress flush. self updateTargetFile. ex retry]. overwritePolicy = #unknown ifFalse: [self archiver overwritePolicy: overwritePolicy]
installingStartItemsTemplate | os | os := OSHandle currentOS. os = #win32 ifTrue: [^#creatingShortcuts << #installer >> 'Creating shortcuts...']. os = #unix ifTrue: [^#creatingStartupScripts << #installer >> 'Creating startup scripts...']. ^String new
installItems: aDictionary selector: aSymbol aDictionary keysAndValuesDo: [:cmp :items | self log currentComponentName: cmp name. items do: [:item | self perform: aSymbol with: item]]
installLogHeader ^#installLogHeaderString << #installer >> 'Installing <1s><nt>from <2s><nt>modified <3p><nt>install completed <4s>' expandMacrosWith: self map fullName with: self map location asString with: self map creationTimestamp with: ((Locale named: #C) printAsTime: Timestamp now policyNamed: #short)
installMacStartItem: aStartItem aStartItem default ifFalse: [^self]. [(aStartItem path asResolvedStringWith: self parent) asFilename setAsDefaultApp] on: Error do: [:ex | ]
installStartItem: aStartItem | os | (aStartItem isForDesktop and: [self parent desktopShortcut value not]) ifTrue: [^self]. os := OSHandle currentOS. os == #win32 ifTrue: [^self installWindowsShortcut: aStartItem]. os == #mac ifTrue: [self installMacStartItem: aStartItem] ifFalse: [self installUnixStartItem: aStartItem]
installStartItemsFrom: components | itemsByCmp | (itemsByCmp := self items: #startItems from: components) isEmpty ifTrue: [^self]. self updateTargetFile: self installingStartItemsTemplate. self installItems: itemsByCmp selector: #installStartItem:
installUnixStartItem: aStartItem | scriptFile wkDir stream path arg | aStartItem isForDesktop ifTrue: [^self]. wkDir := self parent workingDirectoryFrom: aStartItem workingDirectory. scriptFile := self parent tgtDir construct: aStartItem description. ('*MacOSX' match: OSHandle currentPlatformID) ifTrue: [scriptFile := scriptFile directory construct: scriptFile tail , '.command']. (wkDir includes: Character space) ifTrue: [wkDir := '"' , wkDir , '"']. path := aStartItem path asResolvedStringWith: self parent. (path includes: Character space) ifTrue: [path := '"' , path , '"']. arg := aStartItem arguments asResolvedStringWith: self parent. (arg includes: Character space) ifTrue: [arg := '"' , arg , '"']. scriptFile ensureDirectoryNotifying: self. [stream := scriptFile writeStream. [stream nextPutAll: '#!/bin/csh'; nextPutAll: ('<n><n>setenv VISUALWORKS <1s>' expandMacrosWith: self parent tgtString); nextPutAll: ('<n>setenv SOURCE_PATH <1s>' expandMacrosWith: self parent installSource asString); nextPutAll: ('<n><n>cd <1s>' expandMacrosWith: wkDir); nextPutAll: ('<n><1s> <2s><n>' expandMacrosWith: path with: arg)] ensure: [stream close]. scriptFile setProtection: 8r555. self logFile: scriptFile] on: OSErrorHolder noPermissionsSignal do: [:ex | self cannotWriteFile add: scriptFile]
installVariable: aVariableMap | value | OSHandle currentOS == #win32 ifTrue: [^self installWindowsVariable: aVariableMap]. value := aVariableMap value isSymbol ifTrue: [self parent perform: aVariableMap value] ifFalse: [aVariableMap value]. [SystemUtils setEnvironmentVariable: aVariableMap name value: value asString] on: Error do: [:ex | ]. self log logVariable: aVariableMap. (aVariableMap value ~~ #installSource and: [OSHandle currentOS == #unix and: [39 ~= ObjectMemory platformByte]]) ifTrue: [self information nextPutAll: (#setUnixEnvironmentVariableInstructionTemplate << #installer >> 'Please set an environment variable named: <1s><nt>to the value: <2s><nt>in the appropriate unix startup file.' expandMacrosWith: aVariableMap name with: value)]
installVariablesFrom: components | itemsByCmp | (itemsByCmp := self items: #environmentItems from: components) isEmpty ifTrue: [^self]. self updateTargetFile: #installingVariables << #installer >> 'Installing variables...'. self installItems: itemsByCmp selector: #installVariable:
installWindowsShortcut: aStartItem | shortcut | shortcut := nil. [shortcut := self windowsShortcutFrom: aStartItem. shortcut reify. self logFile: shortcut location asFilename] on: ExternalAccessFailed , ShortcutError , OsInaccessibleError do: [:ex | [(aStartItem shared and: [self privatizeUnwritableCommonShortcut: shortcut]) ifTrue: [aStartItem shared: false. ex retry]] on: Error do: [:ex2 | ex2 return]. self cannotWriteFile add: shortcut location. ex return]
installWindowsVariable: aVariableMap | value path | value := (aVariableMap value isSymbol ifTrue: [self parent perform: aVariableMap value] ifFalse: [aVariableMap value]) asString. path := self map variablePath. OSSystemSupport concreteClass new setVariableWithPath: path key: aVariableMap name value: value. self log logVariable: aVariableMap
items: aSymbol from: components | itemsByCmp | itemsByCmp := Dictionary new. components do: [:cmp | (cmp perform: aSymbol) isEmpty ifFalse: [itemsByCmp at: cmp put: (cmp perform: aSymbol)]]. ^itemsByCmp
logFile: aFilename self log logFile: aFilename size: aFilename fileSize time: aFilename modificationTimestamp
logFileAttributes: aDictionary | tgtFile | tgtFile := aDictionary at: #targetFile. self log logFile: tgtFile size: (tgtFile hasTextExtension ifTrue: [tgtFile fileSize] ifFalse: [aDictionary at: #size]) time: tgtFile modificationTimestamp
postInstall self workProcess: nil. self totalProgress value: 1.0. [self defaultAction. self statusUpdateProcess ifNotNil: [:process | process terminate]] on: HeadlessError do: [:ex | ]
postInstallComponent: aProductComponent self componentProgress flush. self totalProgress flush
preInstall self parent disableInitialScreens: 0. self parent isInteractive ifFalse: [(self archiver) overwritePolicy: #overwriteAll; errorPolicy: #skipAll]. self totalProgress initializeValueWith: (self parent components selections inject: 0 into: [:sum :cmp | sum + (cmp sizes inject: 0 into: [:total :sz | total + sz])]). (self parent) setLogForUninstall; setErrorLogPath. self prepareURL
preInstallComponent: aProductComponent | componentProgressCount | self updateTargetFile. componentProgressCount := aProductComponent sizes inject: 0 into: [:total :sz | total + sz]. self componentProgress initializeValueWith: componentProgressCount. self maxProgressCount: self maxProgressCount + componentProgressCount. retryCount := 0
prepareURL | uri | (uri := self map location) isURI ifFalse: [^self]. uri setServerPassive; ensureInstallerLogin
printCannotMakeDirectory | stream | stream := (String new: 256) writeStream. stream cr; nextPutAll: (#couldNotCreateDirectories << #installer >> 'Could not create the following directories:') asString. self cannotMakeDirectory do: [:string | stream crtab; nextPutAll: string]. ^stream contents
printCannotWriteFile | stream | (stream := String new writeStream) cr; nextPutAll: (#couldNotWriteFiles << #installer >> 'Could not write the following files:') asString. self cannotWriteFile do: [:filename | stream crtab; nextPutAll: filename asString]. ^stream contents
printInstallErrors | stream | stream := String new writeStream. self cannotMakeDirectory isEmpty ifFalse: [stream nextPutAll: self printCannotMakeDirectory]. self cannotWriteFile isEmpty ifFalse: [stream nextPutAll: self printCannotWriteFile]. ^stream contents
saveInstallLog | stream errors logName | errors := self printInstallErrors. logName := self parent tgtDir construct: 'install.log'. logName ensureDirectory. stream := logName appendStream. [ [stream position = 0 ifFalse: [stream cr; cr]. stream nextPutAll: self installLogHeader; nextPutAll: errors] ensure: [stream close]. self logFile: logName] on: Error do: [:ex | [self saveInstallLogFailedDialogWithErrors: errors] on: HeadlessError do: [:e | ]. ex return]
userActions | info str flnm message | self parent isHeadless ifTrue: [^self]. (info := self information contents) isEmpty ifTrue: [^self]. flnm := message := nil. [str := (flnm := self parent tgtDir construct: 'userActions.txt') appendStream. [message := #userActionsTemplate << #installer >> 'Certain actions need to be performed by the user.<n>The instructions below are stored in the file:<nt><1s><nn><2s>' expandMacrosWith: flnm asResolvedString with: info. str nextPutAll: message] ensure: [str close]] on: Error do: [:ex | message := #userActionsErrorTemplate << #installer >> 'Certain actions need to be performed by the user,<n>but an error occured when attempting to store<n>the instructions in the file:<nt><1s><nn>The instructions are:<n><2s>' expandMacrosWith: flnm asResolvedString with: info]. self parent doNowInUIProcess: [Dialog report: message]
windowsShortcutFrom: aStartItem | targetDir group location path wkDir arg | targetDir := aStartItem targetForWindows. group := aStartItem group. (group isSymbol and: [self parent respondsTo: group]) ifTrue: [group := self parent perform: group]. group := aStartItem isForDesktop ifTrue: [targetDir asFilename] ifFalse: [targetDir asFilename construct: group]. [group ensureDirectoryNotifying: self] on: Error do: [:ex | ]. location := aStartItem description. (location isSymbol and: [self parent respondsTo: location]) ifTrue: [location := self parent perform: location]. ('*.lnk' match: location) ifFalse: [location := location , '.lnk']. location := group construct: location. [location ensureDirectory] on: Error do: [:ex | ]. path := aStartItem path asResolvedStringWith: self parent. path asFilename extension = '.exe' ifFalse: [path := path asString , '.exe']. wkDir := self parent workingDirectoryFrom: aStartItem workingDirectory. arg := '"' , (aStartItem arguments asResolvedStringWith: self parent) , '"'. ^(Shortcut new) location: location asString; path: path; arguments: arg; description: aStartItem longDescription; workingDirectory: wkDir; yourself
writeVWIniTo: aFilename | dirString sep str tail newEntry signatureByteString | tail := aFilename exists ifTrue: [aFilename contentsOfEntireFile] ifFalse: [String new]. dirString := aFilename directory asString. dirString last == (sep := aFilename separator) ifFalse: [dirString := dirString copyWith: sep]. signatureByteString := self parent imageSignature printString. signatureByteString := signatureByteString copyFrom: 3 to: signatureByteString size - 1. newEntry := signatureByteString , ' ' , dirString , 'vwnt.exe'. ('*' , newEntry , '*' match: tail) ifTrue: [^self]. str := aFilename writeStream. [str nextPutAll: newEntry; cr. tail isEmpty ifFalse: [str nextPutAll: tail; cr]] ensure: [str close]
</methods> <methods> VisualWorks.InstallerPage <category>synchronization</category>
cancel self terminateInstallProcess
okToCancel | result | self workProcess ifNil: [^true]. self suspendInstallProcess. result := Dialog confirm: #confirmCancel << #installer >> 'Are you sure you want to cancel?'. result ifFalse: [self resumeInstallProcess]. ^result
okToProceed ^self workProcess isNil or: [self workProcess isTerminated]
</methods> <methods> VisualWorks.InstallerPage <category>error handling</category>
checkQuit (retryCount < 10 or: [self retryDialog]) ifTrue: [^self]. self parent doNowInUIProcess: [self parent closeRequest]. self cancel
checkRetry: anException (anException class = Error and: [anException messageText ~= 'buffer error']) ifTrue: [anException pass]. retryCount := retryCount + 1. self checkQuit. retryCount < 10 ifFalse: [retryCount := 0. anException resignalAs: OS.ZLib.ZLibBufferError new]. self displayRetryMessage
retryDialog | response | response := self parent doNowInUIProcess: [Dialog confirm: #tryDownloadAgainDialog << #installer >> 'Repeatedly unable to download files, try again?']. response ifTrue: [retryCount := 1]. ^response
volumeFullWarning Dialog warn: (#targetVolumeFullQuitWarning << #installer >> 'The target volume is full:<nt><1s><n>This application will now quit.' expandMacrosWith: self parent installDirectory value). self parent closeRequest
</methods> <methods> VisualWorks.InstallerPage <category>accessing</category>
archiver ^archiver ifNil: [archiver := (Tools.TGZArchiver new) macAttributes: self parent macTypeCreatorByExtension; updateIncrement: 1024 * 16; yourself]
cannotMakeDirectory ^cannotMakeDirectory ifNil: [cannotMakeDirectory := Set new]
cannotWriteFile ^cannotWriteFile ifNil: [cannotWriteFile := Set new]
currentComponent ^currentComponent
currentComponent: aProductComponent currentComponent := aProductComponent
information ^information
information: aWriteStream information := aWriteStream
log ^self parent seedLog value
map ^self parent seedMap value
maxProgressCount ^maxProgressCount ifNil: [maxProgressCount := 0] ifNotNil: [maxProgressCount]
maxProgressCount: anObject maxProgressCount := anObject
parent: anObject super parent: anObject. anObject expressInterestIn: #seedStatus for: self sendBack: #updateText
privatizeUnwritableCommonShortcut: aShortcut | policy | ^(policy := self privatizeUnwritableCommonShortcutPolicy value) = #personalizeAll or: [policy ~= #skipAll and: ['personalize*' match: (self unwritableCommonShortcutDialog: aShortcut)]]
statusUpdateProcess ^statusUpdateProcess
workProcess ^workProcess
workProcess: aProcess aProcess ifNotNil: [aProcess name: 'install process']. workProcess := aProcess
workSemaphore ^workSemaphore ifNil: [workSemaphore := Semaphore new]
</methods> <methods> VisualWorks.InstallerPage <category>updating</category>
displayRetryMessage self updateTargetFile: (#retryMessage << #installer >> 'Installing <1s> - transfer failed. Retrying up to <2p> more times.' expandMacrosWith: self log currentComponent name with: 10 - retryCount). (Delay forSeconds: 2) wait
flushProgress self componentProgress flush. self totalProgress flush
startStatusUpdateProcess statusUpdateProcess := (self parent isHeadless ifTrue: [self statusUpdateHeadless] ifFalse: [self statusUpdateHeadful]) forkAt: Processor userSchedulingPriority - 1
statusTemplate ^self map isRemote ifTrue: [#statusTemplateRemote << #installer >> '<e>Elapsed time: <1s> estimated remaining: <2s> (<3p>KB of <4p>KB total at <5s>KB/s)'] ifFalse: [#statusTemplateLocal << #installer >> '<e>Elapsed time: <1s> estimated remaining: <2s> (<3p>KB of <4p>KB total)']
statusUpdateHeadful ^ [| delay policy speedBlock startTime statusTemplate totProg totalKB widget | delay := Delay forSeconds: 1. policy := TimestampPrintPolicy new us shortPolicyString: 'hh:mm:ss'. speedBlock := self map isRemote ifTrue: [ [:kb :seconds | (seconds isZero ifTrue: [0] ifFalse: [kb / seconds roundTo: 0.1]) printString]] ifFalse: [[:kb :seconds | String new]]. startTime := Timestamp now. statusTemplate := self statusTemplate. totProg := self totalProgress. totalKB := (totProg maxCount / 1024) ceiling. widget := self widgetAt: #status. [| args elapsedSeconds newStatus remainingSeconds totProgVal transferredKB | delay wait. elapsedSeconds := Timestamp now asSeconds - startTime asSeconds. totProgVal := totProg rawProgress. remainingSeconds := totProgVal <= 0 ifTrue: [0] ifFalse: [(elapsedSeconds / totProgVal) ceiling - elapsedSeconds]. transferredKB := totalKB * totProgVal. args := OrderedCollection new. args add: (policy printShort: (Time fromSeconds: elapsedSeconds)). args add: (policy printShort: (Time fromSeconds: remainingSeconds)). args add: transferredKB rounded. args add: totalKB. args add: (speedBlock value: transferredKB value: elapsedSeconds). newStatus := statusTemplate expandMacrosWithArguments: args. self parent doNowInUIProcess: [self status value: newStatus. widget invalidateNow]] repeat]
statusUpdateHeadless ^ [| delay | delay := Delay forSeconds: 5. [delay wait. self parent stdout nextPut: $.] repeat]
update: anAspectSymbol with: aValue from: anObject anAspectSymbol == #untarIncrement ifTrue: [^self updateProgress: aValue]. anAspectSymbol == #untarFileComplete ifTrue: [^self logFileAttributes: aValue]. anAspectSymbol == #directoryCreated ifTrue: [^self log logDirectory: aValue]. anAspectSymbol == #untarArchiveComplete ifTrue: [^self flushProgress]. anAspectSymbol == #untarLinkFailure ifTrue: [^self error: anAspectSymbol]
updateProgress: anInteger self componentProgress incrementCountBy: anInteger. self totalProgress incrementCountBy: ((self maxProgressCount - self totalProgress totalCount max: 0) min: anInteger)
updateTargetFile self updateTargetFile: (#targetFileTemplate << #installer >> 'Installing <1s>' expandMacrosWith: self log currentComponent name)
updateTargetFile: aString self parent isHeadless ifTrue: [(self parent stdout) cr; nextPutAll: aString asString] ifFalse: [self parent doInUIProcess: [self targetFile value: aString asString]]
</methods> <methods> VisualWorks.InstallerPage <category>interface opening</category>
postBuildWith: aBuilder super postBuildWith: aBuilder. #(#status #targetFile) do: [:symbol | (self widgetAt: symbol) ifNotNil: [:editor | editor controller: Controller new]]
postOpenWith: aBuilder super postOpenWith: aBuilder. self install
</methods> <methods> VisualWorks.InstallerPage <category>private</category>
abortInstallationWithoutConfirmation [self parent doInUIProcess: [self parent cancel]] fork. self cancel
deleteLinkMasterLibrary 'linkmaster.dll' asFilename delete
enabledButtons ^#(#cancel)
generateText ^#InstallerText << #installer >> '<1s> files are now being copied to your system.' expandMacrosWith: self map printString
pageTitleText ^(#Installing << #installer >> '<bl>Installing') expandMacros
</methods> <methods> VisualWorks.InstallerPage <category>initialize-release</category>
basicProgressModel | model | model := ProgressModel new. self parent isHeadless ifTrue: [model updateInSeparateProcess: false] ifFalse: [model forkUpdatesFor: self parent mainWindow]. model setSmoothUpdatePolicy. ^model
minComponentUpdatePercentage "Answer the smallest allowable percentage of bytes that will trigger an update to the component progress bar." ^self map location isURI ifTrue: [0.005] ifFalse: [0.05]
minTotalUpdatePercentage "Answer the smallest allowable percentage of bytes that will trigger an update to the total progress bar." ^self map location isURI ifTrue: [0.001] ifFalse: [0.01]
minUpdateIncrement "Answer the smallest allowable number of bytes that will trigger an update to the progress bars." ^self map location isURI ifTrue: [1024 * 16] ifFalse: [1024 * 128]
</methods> <methods> VisualWorks.InstallerPage <category>testing</category>
isActionPage ^true
</methods> <methods> VisualWorks.InstallerPage <category>dialogs</category>
installCancelledDialog self parent doNowInUIProcess: [Dialog warn: #installCancelledWarning << #installer >> 'Install cancelled.']
saveInstallLogFailedDialogWithErrors: errorString Screen default putExternalSelection: errorString. self parent doInUIProcess: [| prompt | prompt := #saveInstallLogFailedDialogWithErrors << #installer >> 'Saving install log to:<nt><1s><n>failed. <2s><3s>' expandMacrosWith: (self parent tgtDir construct: 'install.log') asString with: (errorString isEmpty ifTrue: [#installSucceeded << #installer >> 'There were no other errors during the installation.'] ifFalse: [#installFailed << #installer >> 'The following errors occurred during installation,<n>and have been copied to the system paste buffer:<n>']) with: errorString. Dialog warn: prompt]
sourceArchiveDoesNotExist: aFilename | semaphore | semaphore := Semaphore new. self parent doInUIProcess: [Dialog warn: (#sourceArchiveDoesNotExistDialog << #installer >> 'The expected source file does not exist:<nt><1s><n>Install cancelled.' expandMacrosWith: aFilename asString). self abortInstallationWithoutConfirmation. semaphore signal]. semaphore wait
unwritableCommonShortcutDialog: aShortcut self parent doNowInUIProcess: [Tools.UnwritableCommonShortcutDialog for: aShortcut model: self privatizeUnwritableCommonShortcutPolicy]. ^self privatizeUnwritableCommonShortcutPolicy value ifNil: [UserAbort signalWith: aShortcut]
</methods> <methods> VisualWorks.InstallerPage <category>interface closing</category>
noticeOfWindowClose: aWindow super noticeOfWindowClose: aWindow. aWindow = self parent mainWindow ifTrue: [self statusUpdateProcess ifNotNil: [:process | process terminate]]
</methods> <methods> VisualWorks.InstallerPage <category>aspects</category>
componentProgress ^componentProgress ifNil: [componentProgress := (self basicProgressModel) minUpdatePercentage: self minComponentUpdatePercentage; minUpdateIncrement: 1024 * 16; forAspect: #untarArchive; aspectIncrement: #untarIncrement; yourself]
privatizeUnwritableCommonShortcutPolicy ^privatizeUnwritableCommonShortcutPolicy ifNil: [privatizeUnwritableCommonShortcutPolicy := ValueHolder new]
status ^status ifNil: [status := String new asValue]
targetFile ^targetFile ifNil: [targetFile := String new asValue]
totalProgress ^totalProgress ifNil: [totalProgress := (self basicProgressModel) minUpdatePercentage: self minTotalUpdatePercentage; minUpdateIncrement: 1024 * 128; aspectIncrement: #untarIncrement; yourself]
</methods> <methods> VisualWorks.InstallerPage <category>private-synchronization</category>
resumeInstallProcess self workProcess notNil ifTrue: [[self workProcess resume] on: Object errorSignal do: [:ex | self terminateInstallProcess. ex return]]
suspendInstallProcess self workProcess notNil ifTrue: [[self workProcess suspend] on: Object errorSignal do: [:ex | ex return]]
terminateInstallProcess | process | self workProcess ifNil: [^self]. process := self workProcess. self workProcess: nil. [process terminate] on: Object errorSignal do: [:ex | ex return]
</methods> <methods> VisualWorks.InstallerPage <category>installing</category>
finishWork self workProcess ifNotNil: [self workSemaphore wait]
forkInstallProcess self workProcess: ( [ [ [ [self parent isHeadless ifFalse: [self startStatusUpdateProcess]. self installComponents: self parent components selections; userActions; saveInstallLog] ensure: [[self statusUpdateProcess terminate] on: Error do: [:ex | ]. self log save]. self postInstall] on: OSErrorHolder volumeFullSignal do: [:ex | [self volumeFullWarning] on: HeadlessError do: [:e | ]]] ensure: [self workSemaphore signal]] forkAt: Processor userSchedulingPriority - 2)
install self parent ensureOptions. self terminateInstallProcess. self parent components selections isEmpty ifTrue: [^self defaultAction]. self information: String new writeStream; preInstall; forkInstallProcess
runHeadless self install. [self workSemaphore wait] ensure: [self parent quit]
</methods> <methods> VisualWorks.InclusionPattern <category>accessing</category>
include ^include
include: aBoolean include := aBoolean
pattern ^pattern
pattern: aString pattern := aString
</methods> <methods> VisualWorks.InclusionPattern <category>printing</category>
printOn: aStream super printOn: aStream. aStream nextPut: $(; nextPut: (self include ifTrue: [$+] ifFalse: [$-]); print: self pattern; nextPut: $)
</methods> <methods> VisualWorks.InclusionPattern <category>matching</category>
match: aString ^pattern match: aString
</methods> <methods> VisualWorks.InclusionPattern class <category>instance creation</category>
include: aBoolean pattern: aString ^(self new) include: aBoolean; pattern: aString; yourself
</methods> <methods> VisualWorks.InstallImageStripper class <category>options</category>
classesToKeep "Don't strip these classes." ^(self startupClass classesToKeep copy) addAll: UI.WindowManagerUsagePolicy allSubclasses; yourself
methodsToKeep "Don't strip these methods." ^self startupClass methodsToKeep
startupClass ^StartupClass
startupClass: aClass StartupClass := aClass
</methods> <methods> VisualWorks.InstallImageStripper class <category>workarounds</category>
disableLauncherStatusBarUpdates VisualLauncher compile: 'updateStatusBar ^self' classified: 'private' attributes: nil
disableSettingsDomainChangeNotification SettingsDomain class compile: 'classMethodsChanged ^self' classified: 'notifications' attributes: nil
</methods> <methods> VisualWorks.InstallImageStripper class <category>deployment-private</category>
cleanUp "Prepare to strip image - close Store connection, remove unwanted parcels, empty NC workspaces, and tidy up Undeclared." | remove pcls | self secureImageStartup. IndexedFileMessageCatalog directoriesModel value removeFirst. IndexedFileMessageCatalog updateDirectories. #{Store.DbRegistry} ifDefinedDo: [:reg | reg disconnect]. remove := [:pattern | pcls := Parcel parcels select: [:p | pattern match: p name]. pcls := (SystemUtils sortForLoading: pcls) reverse. pcls do: [:p | Parcel unloadParcelNamed: p name]]. #('*Packing*' '*Store*' '*Postgre*' '*Oracle*' '*SUnit*' '*PatchFileDelivery*' '*SLesson*' '*UIPainter*' '*Database*' '*Debug*') do: [:pattern | remove value: pattern]. #{Tools.SimpleWorkspace.GettingStartedWorkspace} ifDefinedDo: [:wk | wk value: String new]. #{Tools.SimpleWorkspace.IvanWorkspace} ifDefinedDo: [:wk | wk value: String new]. #{Tools.SimpleWorkspace.NonCommercialWorkspace} ifDefinedDo: [:wk | wk value: String new]. #{Tools.SimpleWorkspace.OverviewWorkspace} ifDefinedDo: [:wk | wk value: String new]. (#{RuntimePackager.RuntimeManager} value) cleanUpDeferredBindings; purgeUndeclaredEntries
closeAllWindows Screen default allScheduledControllersDo: [:controller | controller model class == DebuggerClient ifFalse: [controller closeAndUnschedule]]. WindowManager purgeDeadWindows. ProcessEnvironment current localRemoveKey: #WindowManager. ObjectMemory globalGarbageCollect
defaultLocationTail ^'install.im'
imagePrefixFrom: aStringOrNil | imageTail | imageTail := aStringOrNil ifNil: [self defaultLocationTail]. ^('*.im' match: imageTail) ifTrue: [imageTail copyFrom: 1 to: imageTail size - 3] ifFalse: [imageTail]
openRTP "Temporarily replace NoWindowBlock, close all windows, start Runtime Packager, then restore NoWindowBlock." | oldWindowBlock rtp | ScheduledWindow promptForOpen: false. oldWindowBlock := WindowManager noWindowBlock. WindowManager noWindowBlock: [:windowManager | ]. self closeAllWindows. rtp := ((#{RuntimePackager.RuntimeBuilderUI} valueIfUndefinedLoadFrom: 'RuntimePackager') open; yourself) activeApplication. WindowManager noWindowBlock: oldWindowBlock. ^rtp
secureImageStartup ImageConfigurationSystem allowParcelLoading: false; useDefaultConfigFile: false; allowFilein: false; allowExpressions: false; allowSettings: false
</methods> <methods> VisualWorks.InstallImageStripper class <category>deployment</category>
dynamicallyReferencedSelectors ^#(#stripInstallImage:)
stripInstallImage: imageTailOrNil "Set all Runtime Packager options and begin the 3 step save process." | rtp kept | self disableLauncherStatusBarUpdates. self disableSettingsDomainChangeNotification. rtp := self openRTP. self cleanUp. (rtp options) startupClass: self startupClass; startupMethod: #open; imagePath: (self imagePrefixFrom: imageTailOrNil); uiLooks: #(#mac #win #motif) asSet; operatingSystems: #(#mac #win #unix) asSet. (rtp options strippingOptions) add: #doThreeSaves; add: #useAutoLoader. kept := rtp keptItems. kept keptClasses addAll: self classesToKeep. kept keptMethods addAll: self methodsToKeep. kept resetDefaultsFromOptions; hasBeenEdited: false. ObjectMemory globalGarbageCollect. rtp interactWithUser: false; traceMessages; traceMessages; saveParamsTo: 'dynamicParams.rtp' asFilename. "autoTestApplication;" self startupClass debugging: false. rtp stripSystem
</methods> <methods> VisualWorks.ChooseDirectoryPage <category>dialogs</category>
invalidDirectoryNameDialog Dialog warn: (#invalidDirectoryNameDialog << #installer >> 'The following is not a valid filename:<nt><1p><n>Please enter a valid directory name.' expandMacrosWith: self installDirectory value)
unwritableDirectoryDialog Dialog warn: (#unwritableDirectoryDialog << #installer >> 'Cannot write to the following directory:<nt><1p><n>Please enter a writable directory name.' expandMacrosWith: self installDirectory value). ^false
</methods> <methods> VisualWorks.ChooseDirectoryPage <category>synchronization</category>
directoryNamed: directoryString | directory | ^[directory := directoryString asFilename] on: Object errorSignal do: [:ex | self invalidDirectoryNameDialog. ex return: nil]
ensureValidDirectoryNamed: aString | directory | ^(directory := self directoryNamed: aString) notNil and: [self verifyDirectoryIsWritable: directory]
okToBuild ^self parent isExpressInstall not
okToProceed ^self ensureValidDirectoryNamed: self installDirectory value
verifyDirectoryIsWritable: aDirectory "Answer whether aDirectory is writable, or if it can be created." | parentDir | (aDirectory exists and: [aDirectory isDirectory and: [aDirectory isWritable]]) ifTrue: [^true]. parentDir := aDirectory directory. parentDir = aDirectory ifTrue: [^self unwritableDirectoryDialog]. ^self verifyDirectoryIsWritable: parentDir
</methods> <methods> VisualWorks.ChooseDirectoryPage <category>aspects</category>
installDirectory ^self parent installDirectory
</methods> <methods> VisualWorks.ChooseDirectoryPage <category>private</category>
generateText ^#installationDirectorySelectorText << #installer >> 'Choose the installation directory.<nn><1s> components will be installed in directory tree specified below. If the directory does not exist, it will be created.' expandMacrosWith: self parent seedMap value printString
pageTitleText ^(#InstallationDirectory << #installer >> '<bl>Installation Directory') expandMacros
</methods> <methods> VisualWorks.ChooseDirectoryPage <category>interface opening</category>
postBuildWith: aBuilder super postBuildWith: aBuilder. (builder componentAt: #installDirectory) widget controller keyboardHook: [:event :controller | event keyValue == Character cr ifTrue: [controller accepted ifFalse: [controller accept]. self defaultAction. nil] ifFalse: [event]]
</methods> <methods> VisualWorks.ChooseDirectoryPage <category>actions</category>
browseInstallationDirectory | dialog | dialog := ChooseDirectoryDialog new. dialog windowTitle: (#selectInstallationDirectory << #installer >> 'Select installation directory:') asString; acceptButtonLabel: (#select << #installer >> 'Select') asString. dialog open ifTrue: [self installDirectory value: dialog selection asString]
</methods> <methods> VisualWorks.ChooseDirectoryPage class <category>resource accessing</category>
browseInstallationDirectoryIcon ^ToolbarIconLibrary visualFor: #fileBrowser
</methods> <methods> VisualWorks.InstallOptions <category>accessing</category>
installDirectory ^installDirectory
installDirectory: aStringOrNil aStringOrNil ifNotNil: [installDirectory := aStringOrNil]
installDirectoryOr: anEvaluableObject ^self installDirectory ifNil: [installDirectory := anEvaluableObject value]
selections ^selections
selections: aCollectionOrNil aCollectionOrNil ifNotNil: [selections := aCollectionOrNil]
selectionsOr: anEvaluableObject ^self selections ifNil: [selections := anEvaluableObject value]
</methods> <methods> VisualWorks.InstallOptions <category>testing</category>
isInitialized ^self installDirectory notNil and: [self selections notNil]
</methods> <methods> VisualWorks.StartItem <category>queries</category>
targetForWindows ^self location == #desktop ifTrue: [self targetWindowsDesktop] ifFalse: [self targetWindowsStartMenuProgramsDirectory]
targetSharedDesktop | wss | wss := Win95SystemSupport new. ^wss getVariableWithRoot: wss HKEY_LOCAL_MACHINE path: #('Software' 'Microsoft' 'Windows' 'CurrentVersion' 'Explorer' 'Shell Folders') name: 'Common Desktop' ifAbsent: nil
targetSharedStartMenuProgramsDirectory | wss | wss := Win95SystemSupport new. ^wss getVariableWithRoot: wss HKEY_LOCAL_MACHINE path: #('Software' 'Microsoft' 'Windows' 'CurrentVersion' 'Explorer' 'Shell Folders') name: 'Common Programs' ifAbsent: nil
targetUserDesktop | wss | wss := Win95SystemSupport new. ^wss getVariableWithRoot: wss HKEY_CURRENT_USER path: #('Software' 'Microsoft' 'Windows' 'CurrentVersion' 'Explorer' 'Shell Folders') name: 'Desktop' ifAbsent: nil
targetUserStartMenuProgramsDirectory | wss | wss := Win95SystemSupport new. ^wss getVariableWithRoot: wss HKEY_CURRENT_USER path: #('Software' 'Microsoft' 'Windows' 'CurrentVersion' 'Explorer' 'Shell Folders') name: 'Programs' ifAbsent: nil
targetWindowsDesktop ^(('*nt*' match: OSHandle currentPlatformID) and: [self shared]) ifTrue: [self targetSharedDesktop] ifFalse: [self targetUserDesktop]
targetWindowsStartMenuProgramsDirectory ^(('*nt*' match: OSHandle currentPlatformID) and: [self shared]) ifTrue: [self targetSharedStartMenuProgramsDirectory] ifFalse: [self targetUserStartMenuProgramsDirectory]
</methods> <methods> VisualWorks.StartItem <category>accessing</category>
arguments ^arguments ifNil: [arguments := ExpandablePath new]
arguments: aStringOrArray self arguments newPath: (aStringOrArray isString ifTrue: [aStringOrArray isEmpty ifTrue: [Array new] ifFalse: [Filename components: aStringOrArray]] ifFalse: [aStringOrArray])
default ^default ifNil: [default := false]
default: aBoolean default := aBoolean
description ^description ifNil: [description := String new]
description: aString description := self symbolOrString: aString
descriptionAsString ^self description isSymbol ifTrue: [self description printString] ifFalse: [self description]
group ^group ifNil: [group := String new]
group: aString group := self symbolOrString: aString
groupAsString ^self group isSymbol ifTrue: [self group printString] ifFalse: [self group]
location ^location ifNil: [location := #menu]
location: aSymbol location := aSymbol
longDescription ^longDescription
longDescription: aString longDescription := aString
path ^path ifNil: [path := ExpandablePath new]
path: aCollection self path newPath: aCollection
pathFromString: pathString "pathString represents a filename. Break it into component strings and verify it." | newPath | newPath := super pathFromString: pathString. ^newPath = self path ifTrue: [false] ifFalse: [self path: newPath. true]
shared ^shared ifNil: [shared := true]
shared: aBoolean shared := aBoolean
workingDirectory ^workingDirectory ifNil: [workingDirectory := ExpandablePath new]
workingDirectory: aStringOrArray self workingDirectory newPath: (aStringOrArray isString ifTrue: [aStringOrArray isEmpty ifTrue: [Array new] ifFalse: [Filename components: aStringOrArray]] ifFalse: [aStringOrArray])
</methods> <methods> VisualWorks.StartItem <category>printing</category>
printOn: aStream aStream nextPutAll: description
</methods> <methods> VisualWorks.StartItem <category>comparing</category>
hash ^self description hash
</methods> <methods> VisualWorks.StartItem <category>testing</category>
isForDesktop ^self location == #desktop
</methods> <methods> VisualWorks.StartItem class <category>deployment</category>
dynamicallyReferencedSelectors ^#(#arguments: #description: #group: #location: #path: #shared: #workingDirectory:)
</methods> <methods> VisualWorks.StartItem class <category>accessing</category>
aspectsForLiteralSpec ^#('arguments' 'default' 'description' 'longDescription' 'group' 'location' 'path' 'shared' 'workingDirectory') , super aspectsForLiteralSpec
</methods> <methods> VisualWorks.EnvironmentItem <category>accessing</category>
name ^name
name: aString name := aString
value ^value
value: aSymbol value := aSymbol
</methods> <methods> VisualWorks.EnvironmentItem <category>printing</category>
printOn: aStream aStream nextPutAll: name; nextPutAll: '->'; nextPutAll: value printString
</methods> <methods> VisualWorks.EnvironmentItem <category>comparing</category>
hash ^self name hash
</methods> <methods> VisualWorks.EnvironmentItem <category>initialize-release</category>
initialize super initialize. self name: String new. self value: self name asSymbol
</methods> <methods> VisualWorks.EnvironmentItem class <category>deployment</category>
dynamicallyReferencedSelectors ^#(#name: #value:)
</methods> <methods> VisualWorks.EnvironmentItem class <category>accessing</category>
aspectsForLiteralSpec ^#('name' 'value') , super aspectsForLiteralSpec
</methods> <methods> VisualWorks.ExpandablePath <category>printing</category>
storeOn: aStream self asArray storeOn: aStream
</methods> <methods> VisualWorks.ExpandablePath <category>converting</category>
asFilenameRelativeTo: aDirectory | head separator stream | head := aDirectory asString. separator := aDirectory separator. stream := String new writeStream. stream nextPutAll: head. self do: [:element | stream nextPut: separator; nextPutAll: element]. ^aDirectory class new named: stream contents
asFilenameWith: anObject ^(self asStringWith: anObject) asLogicalFileSpecification asFilename
asFilenameWithAll: aCollection ^(self asStringWithAll: aCollection) asLogicalFileSpecification asFilename
asResolvedStringWith: anObject ^(self copyExpandedWith: anObject) asString asLogicalFileSpecification asResolvedString
asString ^self asStringSeparatedBy: Filename separator
asStringSeparatedBy: aCharacter | str skipSeparator | str := (String new: 256) writeStream. self do: [:element | skipSeparator := element notEmpty and: [element last = aCharacter]. str nextPutAll: (element isSymbol ifTrue: [element printString] ifFalse: [element])] separatedBy: [skipSeparator ifFalse: [str nextPut: aCharacter]]. ^str contents
asStringWith: anObject ^(self copyExpandedWith: anObject) asString
asStringWithAll: aCollection ^(self copyExpandedWithAll: aCollection) asString
</methods> <methods> VisualWorks.ExpandablePath <category>initialize-release</category>
newPath: aCollection (self samePathAs: aCollection) ifTrue: [^false]. self changeSizeTo: aCollection size. 1 to: self size do: [:i | self at: i put: (aCollection at: i)]. ^true
</methods> <methods> VisualWorks.ExpandablePath <category>expanding - contracting</category>
contractPattern: aCollection replaceWith: replacementElement "Replace the first sequence of elements matching aCollection with replacementElement." | startIndex patternSize newSize | startIndex := self firstOccurrenceOfPattern: aCollection. startIndex ifNil: [^self]. self at: startIndex put: replacementElement. patternSize := aCollection size. newSize := self size + 1 - patternSize. startIndex + 1 to: newSize do: [:i | self at: i put: (self at: i + patternSize)]. self changeSizeTo: newSize
copyExpandedWith: anObject | newPath expandedPath | newPath := self class new: self size * 2. self do: [:element | (element isSymbol and: [anObject respondsTo: element]) ifTrue: [expandedPath := anObject perform: element. expandedPath isString ifTrue: [newPath add: expandedPath] ifFalse: [newPath addAll: expandedPath]] ifFalse: [newPath add: element]]. ^newPath
copyExpandedWithAll: aCollection | newPath | newPath := self class new: self size * 2. self do: [:element | element isSymbol ifTrue: [(aCollection detect: [:object | object respondsTo: element] ifNone: nil) ifNil: [newPath add: element] ifNotNil: [:expander | newPath addAll: (expander perform: element)]] ifFalse: [newPath add: element]]. ^newPath
expandWith: anObject self newPath: (self copyExpandedWith: anObject)
</methods> <methods> VisualWorks.ExpandablePath <category>accessing</category>
macroElements ^self select: [:element | element isSymbol]
stringElements ^self reject: [:element | element isSymbol]
</methods> <methods> VisualWorks.ExpandablePath <category>inquiries</category>
expandsFullyWith: anObject ^self noneSatisfy: [:element | element isSymbol and: [(anObject respondsTo: element) not]]
expandsWith: anObject ^self anySatisfy: [:element | element isSymbol and: [anObject respondsTo: element]]
firstOccurrenceOfPattern: aCollection "Answer the starting index of the first occurrence of aCollection if found, or nil if not found." | patternStartIndex | patternStartIndex := 1. [patternStartIndex <= (self size + 1 - aCollection size)] whileTrue: [((1 to: aCollection size) detect: [:i | (self at: i + patternStartIndex - 1) ~= (aCollection at: i)] ifNone: nil) ifNil: [^patternStartIndex] ifNotNil: [:lastTestedIndex | patternStartIndex := lastTestedIndex + patternStartIndex]]. ^nil
isExpandable ^self anySatisfy: [:element | element isSymbol]
isLiteral ^true
</methods> <methods> VisualWorks.ExpandablePath <category>comparing</category>
samePathAs: aSequenceableCollection ^self size = aSequenceableCollection size and: [(1 to: self size) noneSatisfy: [:i | (self at: i) ~= (aSequenceableCollection at: i)]]
</methods> <methods> VisualWorks.ExpandablePath <category>As yet unclassified</category>
<= anExpandablePath | count | count := 0. [count < self size and: [count < anExpandablePath size]] whileTrue: [count := count + 1. (self at: count) = (anExpandablePath at: count) ifFalse: [^(self at: count) < (anExpandablePath at: count)]]. ^self size <= anExpandablePath size
</methods> <methods> VisualWorks.ExpandablePath class <category>accessing</category>
conversionSelectorsFromLiteralArray ^#(#addAll:)
</methods> <methods> VisualWorks.CheckServerPage <category>updating</category>
changedServerChecked self parent serverChecked value ifFalse: [^self setButtonsForScan]. self forkScanProgressProcess
checkScanComplete self parent scanning ifTrue: [^self]. self parent doNowInUIProcess: [self parent suggestInitialAction. self parent checkForPreviousInstallation ifTrue: [self parent expressInstall value: false]]. self parent clearScanQueue. scanProgressProcess ifNotNil: [:process | process terminate. scanProgressProcess := nil]. self parent doNowInUIProcess: [Cursor normal show. self updateUI. self parent serverChecked value ifFalse: [^self]. (self parent isExpressInstall and: [self = self parent currentSubApp]) ifTrue: [self parent next]]
forkScanProgressProcess Cursor wait show. scanProgressProcess := [| delay | self scanText: self scanStartedText. delay := Delay forSeconds: 1. [delay wait. self updateScanText] repeat] forkAt: Processor userSchedulingPriority + 1
scanStartedText ^(#remoteScanningStarted << #installer >> 'Remote scanning started.') expandMacros
setButtonsForScan self parent enableDefaultButton. self parent enablePreviousButton. self setEnablement: true forWidgetNamed: #checkServer. self setEnablement: false forWidgetNamed: #cancelScan. self setEnablement: false forWidgetNamed: #applyUpdate
setButtonsForScanInProgress self parent disableDefaultButton. self parent disablePreviousButton. self setEnablement: false forWidgetNamed: #checkServer. self setEnablement: true forWidgetNamed: #cancelScan. self setEnablement: false forWidgetNamed: #applyUpdate
setButtonsForUpdate self parent enableDefaultButton. self parent enablePreviousButton. self setEnablement: false forWidgetNamed: #checkServer. self setEnablement: false forWidgetNamed: #cancelScan. (self wrapperAt: #applyUpdate) ifNotNil: [:wrapper | | enablement | enablement := self parent updateAvailable. (wrapper isEnabled xor: enablement) ifTrue: [wrapper isEnabled: enablement]]
setButtonsForUpdateInProgress self parent disableDefaultButton. self parent disablePreviousButton. self setEnablement: false forWidgetNamed: #checkServer. self setEnablement: false forWidgetNamed: #cancelScan. self setEnablement: false forWidgetNamed: #applyUpdate
setEnablement: aBoolean forWidgetNamed: aSymbol (self wrapperAt: aSymbol) ifNotNil: [:wrapper | wrapper isEnabled = aBoolean ifFalse: [wrapper isEnabled: aBoolean]]
updateButtons self parent scanning ifTrue: [^self setButtonsForScanInProgress]. self parent isExpressInstall ifTrue: [^self setEnablement: false forWidgetNamed: #cancelScan]. self parent serverChecked value ifTrue: [^self setButtonsForUpdate]. self setButtonsForScan
updateUI self updateButtons; updateText
</methods> <methods> VisualWorks.CheckServerPage <category>private</category>
checkServerInstructions ^self parent isExpressInstall ifTrue: [(#checkServerInstructionsExpress << #installer >> 'About to check Cincom''s FTP server for additional versions of Cincom Smalltalk and updates for this Installer. No information is collected by Cincom during this step.<nn>Server scan will proceed momentarily.') expandMacros] ifFalse: [(#checkServerInstructions << #installer >> 'Click <b>Check Server<e> to check Cincom''s FTP server for additional versions of Cincom Smalltalk and updates for this Installer. No information is collected by Cincom during this step.<nn>Or, click <b>Next<e> to proceed.') expandMacros]
enabledButtons ^(self parent scanning not and: [self parent isExpressInstall not]) ifTrue: [super enabledButtons] ifFalse: [super enabledButtons copyWithout: #defaultButton]
generateText self parent scanning ifTrue: [^self scanText]. ^self parent serverChecked value ifTrue: [self updateAvailableInstructions] ifFalse: [self checkServerInstructions]
pageTitleText ^(#titleCheckServerPage << #installer >> '<bl>Check for Available Downloads') expandMacros
previousInstallationText ^self parent checkForPreviousInstallation ifTrue: [(#previousInstallationText << #installer >> '<nnb>A previous installation was detected<en>The following pages will allow you to resolve potential conflicts by choosing a different version to install, changing the target directory, or selecting different components to install.') expandMacros] ifFalse: [String new]
scanResultsText ^#scanResultsText << #installer >> 'Server scan complete. Remote versions available for download: <1p>' expandMacrosWith: self parent versionCountRemoteInstall
showInstallingUpdates self text value: (#installingUpdates << #installer >> 'Installing updates...') asString
updateAvailableInstructions ^'<1x><2x><3x>' expandMacrosWith: self scanResultsText with: self previousInstallationText with: (self parent updateAvailable value ifTrue: [self updateAvailableText] ifFalse: [self upToDateText])
updateAvailableText ^self parent isExpressInstall ifTrue: [(#updateAvailableTextExpress << #installer >> '<nn>Installation will proceed momentarily.') expandMacros] ifFalse: [(#updateAvailableText << #installer >> '<nn>An update to this installer application is available. Click <b>Apply Update<e> to apply it, or click <b>Next<e> to proceed without updating.') expandMacros]
updateScanText | lines newText urls oldText | oldText := self scanText readStream. newText := String new writeStream. newText nextPutAll: (oldText throughAll: self scanStartedText). oldText through: Character cr. lines := oldText atEnd ifTrue: [OrderedCollection new] ifFalse: [oldText upToEnd tokensBasedOn: Character cr]. urls := self parent scanQueue copyContents. 1 to: urls size do: [:i | newText cr. newText nextPutAll: (lines size < i ifTrue: [#scanningTemplate << #installer >> '<t>Scanning <1s>' expandMacrosWith: (urls at: i) host] ifFalse: [| line done | line := lines at: i. (self parent scanProcesses includesKey: (urls at: i)) ifTrue: [newText nextPutAll: line. '.'] ifFalse: [done := (#spaceDone << #installer >> ' done') asString. done = (line copyFrom: line size - done size + 1 to: line size) ifTrue: [line] ifFalse: [newText nextPutAll: line. done]]])]. self scanText: newText contents. self parent doNowInUIProcess: [self updateText]
upToDateText ^self parent isExpressInstall ifTrue: [(#upToDateTextExpress << #installer >> '<nn>This installer version is up to date. Installation will proceed momentarily.') expandMacros] ifFalse: [(#upToDateText << #installer >> '<nn>This installer version is up to date. Click <b>Next<e> to proceed.') expandMacros]
</methods> <methods> VisualWorks.CheckServerPage <category>interface opening</category>
postBuildWith: aBuilder super postBuildWith: aBuilder. self updateUI
postOpenWith: aBuilder super postOpenWith: aBuilder. self parent isExpressInstall ifFalse: [^self]. self parent checkServer. self updateUI
</methods> <methods> VisualWorks.CheckServerPage <category>online updates</category>
download: anFtpURL to: aFilename | fileStream | fileStream := (aFilename withEncoding: #binary) writeStream. [anFtpURL readStreamDo: [:ftpStream :context | self appendText: #downloadingElipsis << #installer >> 'downloading...'. [ftpStream atEnd] whileFalse: [fileStream nextPutAll: (ftpStream nextAvailable: 1024)]]] ensure: [fileStream close]. ^aFilename
loadParcelFrom: anFtpURL self appendText: (#parcelLoadingTemplate << #installer >> '<nt><1s>: loading...' expandMacrosWith: anFtpURL tail). [ [Parcel loadParcelFrom: anFtpURL. self appendText: #done << #installer >> 'done.'] on: Parcel parcelAlreadyLoadedSignal do: [:ex | ex resume: true]] on: Error , Net.FTPSignal do: [:ex | self appendText: #errorLoadAborted << #installer >> ' error - load aborted.'. ex return]
programFilename ^self parent commandLine first asFilename
updateEntireApplication | source target | source := (self parent configFileLocation directory construct: 'installerUpdates') construct: self defaultProgramFilename tail. target := ('temp' , source tail) asFilename. self download: source to: target. self class startProgram: target withArgs: target asString , ' -ReplaceProgram ' , self programFilename asString. ObjectMemory quit
</methods> <methods> VisualWorks.CheckServerPage <category>accessing</category>
parent: anObject super parent: anObject. anObject serverChecked onChangeSend: #changedServerChecked to: self. self changedServerChecked. anObject expressInterestIn: #readConfigFileStart for: self sendBack: #updateScanText. anObject expressInterestIn: #readConfigFileEnd for: self sendBack: #checkScanComplete
scanText ^scanText ifNil: [scanText := Text new]
scanText: aText scanText := aText
</methods> <methods> VisualWorks.CheckServerPage <category>actions</category>
applyUpdate | updates | self setButtonsForUpdateInProgress. updates := self parent availableParcelUpdates. updates isEmpty ifFalse: [self showInstallingUpdates]. updates do: [:parcelURL | self loadParcelFrom: parcelURL]. (self parent configurationAt: self parent configFileLocation at: 'installerImageVersion') ifNotNil: [:availableVersionString | availableVersionString = self parent currentVersionString ifFalse: [self updateEntireApplication]]. (self parent) updateApplied: true; restart
cancel self cancelScan
cancelScan self parent scanning ifFalse: [^self]. self parent scanProcesses keysAndValuesDo: [:url :process | process terminate. self parent scanProcesses removeKey: url ifAbsent: nil. self parent configuration removeKey: url ifAbsent: nil]. self parent clearScanQueue. self parent serverChecked value: false. self checkScanComplete. Cursor normal show. self parent isExpressInstall ifTrue: [self parent previous]
checkServer self parent checkServer. self updateUI
</methods> <methods> VisualWorks.CheckServerPage <category>constants</category>
defaultProgramFilename ^('VWInstaller' , (OSHandle currentOS == #win32 ifTrue: ['.exe'] ifFalse: ['.im'])) asFilename
</methods> <methods> VisualWorks.CheckServerPage <category>synchronization</category>
okToBuild self parent isExpressInstall ifFalse: [^true]. self parent scanning ifTrue: [^true]. self parent commandLineSeedMap ifNotNil: [^false]. ^self parent serverChecked value not
</methods> <methods> VisualWorks.CheckServerPage <category>aspects</category>
versionString ^versionString ifNil: [versionString := (#vString << #installer >> '<1s> v<2s>' expandMacrosWith: self parent installerName with: self parent currentVersionString) asValue]
</methods> <methods> VisualWorks.CheckServerPage class <category>online updates</category>
checkMacStartupCommands "Since the Mac does not support a normal command line, on startup check for command line options in a special file." | file tokens space str | OSHandle currentOS == #mac ifFalse: [^self]. file := self macCommandFile. file exists ifFalse: [^self]. tokens := OrderedCollection new. space := Character space. str := file contentsOfEntireFile readStream. [str atEnd] whileFalse: [tokens add: (str upTo: space)]. tokens first = '-ReplaceProgram' ifTrue: [^self replaceProgramWith: (tokens at: 2)]
replaceProgramWith: aString | source target count | source := self parent commandLine first asFilename. target := aString asFilename. count := 5. [0 < count and: [[target delete] on: Error do: [:ex | ex return]. target exists]] whileTrue: [count := count - 1. (Delay forSeconds: 2) wait]. source moveTo: target. (OSHandle currentOS == #mac and: [self macCommandFile exists]) ifTrue: [self macCommandFile delete]. self startProgram: target withArgs: target asString. ObjectMemory quit
startMacProgram: aFilename withArgs: aString self writeMacCommandLineArguments: aString to: (aFilename directory construct: self macCommandFile asString). MacAppLaunchInterface launchApp: aFilename asString
startProgram: aFilename withArgs: aString OSHandle currentOS == #mac ifTrue: [^self startMacProgram: aFilename withArgs: aString]. ExternalProcess defaultClass shOne: aString
startUnixProgram: aFilename withArgs: aString UnixProcess forkJob: aFilename asString arguments: aString
writeMacCommandLineArguments: aString to: aFilename | str | aFilename exists ifTrue: [aFilename delete]. aString isEmpty ifTrue: [^self]. str := aFilename writeStream. [str nextPutAll: aString] ensure: [str close]
</methods> <methods> VisualWorks.CheckServerPage class <category>constants</category>
macCommandFile ^'netInstallerMacCommandFile.txt' asFilename
</methods> <methods> VisualWorks.CheckServerPage class <category>dynamic references</category>
dynamicallyReferencedSelectors ^#(#startUnixProgram:withArgs:)
</methods> <methods> Tools.UnwritableCommonShortcutDialog <category>actions</category>
personalize self resultHolder value: (self applyToAll value ifTrue: [#personalizeAll] ifFalse: [#personalize]). self accept value: true
skip self resultHolder value: (self applyToAll value ifTrue: [#skipAll] ifFalse: [#skip]). self accept value: true
</methods> <methods> Tools.UnwritableCommonShortcutDialog <category>initialize-release</category>
setMessageFor: aShortcut self message value: (#unwritableCommonShortcutDialog << #installer >> 'The following shortcut cannot be written to the common area:<nt><1s><n>Write it to the current user''s personal area instead?' expandMacrosWith: aShortcut location)
</methods> <methods> VisualWorks.InstallLog <category>accessing</category>
addComponent: aComponentLog aComponentLog name ifNil: [self addUnnamedComponent: aComponentLog] ifNotNil: [self addNamedComponent: aComponentLog]
addNamedComponent: aComponentLog (self components at: aComponentLog name asSymbol ifAbsentPut: [aComponentLog]) updateWith: aComponentLog
addUnnamedComponent: aComponentLog unnamedComponent ifNil: [unnamedComponent := aComponentLog] ifNotNil: [unnamedComponent updateWith: aComponentLog]
applicationName ^(applicationName isNil or: [applicationName isEmpty]) ifTrue: [super applicationName] ifFalse: [applicationName]
applicationName: aStringOrNil applicationName := aStringOrNil ifNil: [String new]
componentList ^self components asSortedCollection asList
components ^components ifNil: [self initializeComponents]
currentComponent ^currentComponent ifNil: [currentComponent := self unnamedComponent]
currentComponent: aComponentLog (currentComponent := self components at: aComponentLog name asSymbol ifAbsentPut: [aComponentLog]) fromComponentLog: aComponentLog
currentComponentName: name currentComponent := self components at: name asSymbol ifAbsentPut: [ComponentLog new name: name asString]
dirty ^dirty ifNil: [dirty := false]
dirty: aValue dirty := aValue
external ^external ifNil: [external := false]
external: aBoolean external := aBoolean
location: aFilename location := aFilename asFilename. location exists ifFalse: [^self]. location isDirectory ifTrue: [^self error: (#logCannotBeDirectoryTemplate << #installer >> 'Uninstall log file cannot be a directory: <1s>' expandMacrosWith: aFilename asString)]. location isReadable ifFalse: [^self error: #cannotReadLogFile << #installer >> 'Cannot read uninstall log file.']. self readComponents
unnamedComponent ^unnamedComponent ifNil: [unnamedComponent := ComponentLog new]
unnamedComponent: aComponentLog unnamedComponent ifNil: [unnamedComponent := aComponentLog] ifNotNil: [unnamedComponent fromComponentLog: aComponentLog]
</methods> <methods> VisualWorks.InstallLog <category>testing</category>
isEmpty ^self components isEmpty
isInitialized ^status = #initialized
</methods> <methods> VisualWorks.InstallLog <category>initialize-release</category>
compatReadComponentsFrom: anArray | firstToken start | firstToken := anArray first first. start := (firstToken isBindingReference or: [firstToken isSymbol]) ifTrue: [1] ifFalse: [2]. start to: anArray size do: [:index | self addComponent: (self readComponentFrom: (anArray at: index))]. self dirty: false
fromInstallLog: anInstallLog self applicationName: anInstallLog applicationName. self components: anInstallLog components. self unnamedComponent: anInstallLog unnamedComponent. self dirty: false
initializeComponents unnamedComponent := nil. ^components := Dictionary new
readComponentFrom: anArray anArray size = 7 ifTrue: [^self readComponentFromSize7Array: anArray]. anArray size = 4 ifTrue: [^self readComponentFromSize4Array: anArray]. ^anArray decodeAsLiteralArray
readComponentFromSize4Array: anArray ^(ComponentLog new) name: anArray first; environmentItems: (anArray at: 2) asList; fileMaps: (anArray at: 3) asList; startItems: anArray last asList; yourself
readComponentFromSize7Array: anArray ^(ComponentLog new fromLiteralArrayEncoding: anArray) name: anArray first; yourself
readComponents | stream array | self external ifTrue: [status := #initialized. ^self]. self initializeComponents. stream := self location readStream. (array := [[Object readFrom: stream] ensure: [stream close]] on: Error do: [:ex | ex return]) ifNil: [^self]. array first isBindingReference ifTrue: [self fromInstallLog: array decodeAsLiteralArray] ifFalse: [self compatReadComponentsFrom: array]. self dirty: false. status := #initialized
</methods> <methods> VisualWorks.InstallLog <category>logging</category>
instVarNamesForInstall ^#('applicationName' 'components' 'unnamedComponent')
logDirectory: aFilename self checkComponentSelected. self currentComponent logDirectory: aFilename. self dirty: true
logFile: aFilename size: anInteger time: aTimestamp self checkComponentSelected. self currentComponent logFile: aFilename size: anInteger time: aTimestamp. self dirty: true
logVariable: aVariableMap self checkComponentSelected. self currentComponent logVariable: aVariableMap. self dirty: true
removeComponent: aProductComponent aProductComponent name ifNil: [unnamedComponent := nil] ifNotNil: [self components removeKey: aProductComponent name asSymbol ifAbsent: nil]
save | stream | self dirty ifFalse: [^self]. [self location ensureDirectoryNotifying: self] on: Error do: [:ex | ^ [ [Dialog warn: (#logDirectoryDoesNotExistDialog << #installer >> 'Could not save uninstall log because directory does not exist:<nt><1s>' expandMacrosWith: self location directory asString)] uiEventNow] on: HeadlessError do: [:e | ]]. stream := self location writeStream. [SpecWriter new printAsSpec: self on: stream] ensure: [stream close]. self dirty: false
</methods> <methods> VisualWorks.InstallLog <category>printing</category>
displayString ^self applicationName
printOn: aStream aStream nextPutAll: self applicationName
</methods> <methods> VisualWorks.InstallLog <category>private</category>
checkComponentSelected self currentComponent ifNil: [self error: #noComponentSelected << #installer >> 'No component selected.']
</methods> <methods> VisualWorks.InstallLog class <category>defaults</category>
defaultLocationTail ^'uninstal.log'
</methods> <methods> VisualWorks.InstallLog class <category>instance creation</category>
in: aDirectoryOrString named: aStringOrNil ^self on: (self defaultLocationRelativeTo: aDirectoryOrString) named: aStringOrNil
oldIn: aDirectoryOrString ^self oldIn: aDirectoryOrString named: nil
oldIn: aDirectoryOrString named: aStringOrNil | newLocation | newLocation := self defaultLocationRelativeTo: aDirectoryOrString. ^newLocation definitelyExists ifTrue: [self on: newLocation named: aStringOrNil] ifFalse: [nil]
on: aFileOrString ^self on: aFileOrString named: nil
on: aFileOrString for: anObject ^self on: aFileOrString named: nil external: false
on: aFileOrString named: aStringOrNil ^self on: aFileOrString named: aStringOrNil external: false
on: aFileOrString named: aStringOrNil external: aBoolean ^(self new) applicationName: aStringOrNil; location: aFileOrString; external: aBoolean; yourself
</methods> <methods> VisualWorks.InstallLog class <category>accessing</category>
aspectsForLiteralSpec ^#('applicationName' 'unnamedComponent' 'components')
defaultLocationRelativeTo: aDirectoryOrString ^aDirectoryOrString asFilename construct: self defaultLocationTail
</methods> <methods> VisualWorks.InstallerPackagerUnix <category>accessing</category>
archiver ^archiver ifNil: [archiver := Filename defaultDirectory construct: 'makeself-cvs/makeself.sh'. archiver exists ifFalse: [self extractMakeself]. archiver] ifNotNil: [archiver]
tempDirectory ^Filename defaultDirectory construct: 'temp'
workingImage (workingImage isNil and: [super workingImage exists not and: [Dialog confirm: (#createWkImage << #installer >> 'Working image does not exist. Create it?')]]) ifTrue: [self createAndStripWorkingImage]. ^super workingImage
</methods> <methods> VisualWorks.InstallerPackagerUnix <category>private</category>
clearTemp (self tempDirectory) deleteTreeForced; createDirectory
convertWorkingImageTo64Bit self halt.
createAndStripWorkingImage self createWorkingImage; startThreeStepStrip; compressImage: self workingImage; nextSave; compressImage: self workingImage; nextSave; backupUncompressedImage; compressImage: self workingImage
extractMakeself UnixProcess shOne: '$VISUALWORKS/packaging/makeself.run' asLogicalFileSpecification asResolvedString , ' --nox11'
initializeTempDirectory self packagingDirectory exists ifTrue: [self packagingDirectory deleteTreeForced]. self packagingDirectory createDirectory
initializeTempDirectoryWithAll: filenames self initializePackagingDirectory. filenames do: [:fn | fn copyToDirectory: self packagingDirectory]
packageFlatStructure: filenames into: aFilename withGZip: aBoolean label: labelString script: scriptCommand self initializePackagingDirectoryWithAll: filenames. self packageInto: aFilename withGZip: aBoolean label: labelString script: scriptCommand. self packagingDirectory deleteTreeForced
packageInto: aFilename withGZip: aBoolean label: labelString script: scriptCommand UnixProcess shOne: ('<1s> --notemp --nox11 --nowait <2s> <3s> <4s> <5s> <6s>' expandMacrosWithArguments: ((OrderedCollection new) add: self archiver asString; add: (aBoolean ifTrue: ['--gzip'] ifFalse: ['--compress']); add: self packagingDirectory asString; add: aFilename asString; add: labelString; add: scriptCommand; yourself)). Transcript cr; show: aFilename asString; show: ' created'
packageMacOSXFrom: aDirectory into: aFilename self initializePackagingDirectory; stageContentsInfoPlist; stageContentsPkgInfo; stageContentsResourcesEnglishProjInfoPlistStrings; stageInstallerIcon; stageDocumentIconFrom: aDirectory; stageVMFrom: aDirectory; stageWorkingImage. UnixProcess shOne: ('stuff -n=<1s> -f=sit5 <2s>.app' expandMacrosWith: aFilename asString with: self packagingDirectory prefix). self packagingDirectory deleteTreeForced. Transcript cr; show: aFilename asString; show: ' created'
stageContentsInfoPlist | stream | stream := (self packagingDirectory construct: 'Contents/Info.plist') ensureDirectory; writeStream. [stream nextPutAll: '<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd"> <plist version="1.0"> <dict> <key>CFBundleDevelopmentRegion</key> <string>English</string> <key>CFBundleDocumentTypes</key> <array> <dict> <key>CFBundleTypeExtensions</key> <array> <string>vwi</string> <string>vwu</string> </array> <key>CFBundleTypeIconFile</key> <string>ImageIcons</string> <key>CFBundleTypeName</key> <string>Image</string> <key>CFBundleTypeOSTypes</key> <array> <string>VWIF</string> </array> <key>CFBundleTypeRole</key> <string>Editor</string> </dict> </array> <key>CFBundleExecutable</key> <string>'; nextPutAll: self packagingDirectory prefix; nextPutAll: '</string> <key>CFBundleIconFile</key> <string>MainIcons</string> <key>CFBundleIdentifier</key> <string>com.cincom.VWInstaller</string> <key>CFBundleInfoDictionaryVersion</key> <string>6.0</string> <key>CFBundlePackageType</key> <string>APPL</string> <key>CFBundleSignature</key> <string>VWIF</string> <key>CFBundleVersion</key> <string>'; nextPutAll: InstallerMainApplication currentVersionString; nextPutAll: '</string> <key>NSMainNibFile</key> <string>MainMenu</string> <key>NSPrincipalClass</key> <string>NSApplication</string> </dict> </plist>'] ensure: [stream close]
stageContentsPkgInfo | stream | stream := (self packagingDirectory construct: 'Contents/PkgInfo') ensureDirectory; writeStream. [stream nextPutAll: 'APPLVWIF'] ensure: [stream close]
stageContentsResourcesEnglishProjInfoPlistStrings | stream | stream := (self packagingDirectory construct: 'Contents/Resources/English.lproj/InfoPlist.strings') ensureDirectory; writeStream. [stream nextPutAll: ('%<?xml version="1.0" encoding="UTF-8"?><n>%<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd"> %<plist version="0.9"><n>%<dict><nt>%<key>CFBundleGetInfoString%</key><nt>%<string>VisualWorks Installer Version <1s>, Copyright 1999-2005 Cincom Systems, Inc.%</string><nt>%<key>CFBundleName%</key><nt>%<string>VisualWorks%</string><nt>%<key>CFBundleShortVersionString%</key><nt>%<string>VisualWorks Version <1s>%</string><nt>%<key>NSHumanReadableCopyright%</key><nt>%<string>Copyright 1999-2005 Cincom Systems, Inc.%</string><n>%</dict><n>%</plist>' expandMacrosWith: InstallerMainApplication currentVersionString)] ensure: [stream close]
stageDocumentIconFrom: aDirectory (aDirectory construct: 'Contents/Resources/ImageIcons.icns') copyTo: (self packagingDirectory construct: 'Contents/Resources/ImageIcons.icns')
stageInstallerIcon | src tgt | src := '$(VISUALWORKS)/packaging/installer/VWInstaller.icns' asLogicalFileSpecification asFilename. tgt := self packagingDirectory construct: 'Contents/Resources/MainIcons.icns'. tgt ensureDirectory. src copyTo: tgt
stageVMFrom: aDirectory (aDirectory construct: 'Contents/MacOS/visual') copyTo: ((self packagingDirectory construct: 'Contents/MacOS/' , self packagingDirectory prefix) ensureDirectory; yourself)
stageWorkingImage self workingImage copyTo: (self packagingDirectory construct: 'Contents/Resources/resource.im')
</methods> <methods> VisualWorks.InstallerPackagerUnix <category>package</category>
packageArchiveForMacOSX "self packageArchiveForMacOSX" [self packagingDirectory: 'VWInstallerMacOSX.app' asFilename. self packageMacOSXFrom: '$(VISUALWORKS)/bin/macx/visual.app' asLogicalFileSpecification asFilename into: 'VWInstallerMacOSX.sit' asFilename] on: AbortPackaging do: [:ex | ]. self packagingDirectory: nil
packageArchiveForMacOSX_X11 "self packageArchiveForMacOSX_X11" [self packagingDirectory: 'VWInstallerMacOSX_X11.app' asFilename. self packageMacOSXFrom: '$(VISUALWORKS)/bin/macxx11/visual.app' asLogicalFileSpecification asFilename into: 'VWInstallerMacOSX_X11.sit' asFilename] on: AbortPackaging do: [:ex | ]. self packagingDirectory: nil
packageArchivesForAll [self workingImage. self packageSelfExtractorForAIX; packageSelfExtractorForHPUX; packageSelfExtractorForLinuxPPC; packageSelfExtractorForLinuxSPARC; packageSelfExtractorForLinuxX86; packageArchiveForMacOSX; packageArchiveForMacOSX_X11; packageSelfExtractorForSGI; packageSelfExtractorForSolaris; packageSelfExtractorForLinuxX86_64_64bit] on: AbortPackaging do: [:ex | ^self]
packageSelfExtractorForAIX "self packageSelfExtractorForAIX" [| vm | vm := self engineForPlatformByte: 21. self packageFlatStructure: (Array with: vm with: self workingImage) into: 'VWInstallerAIX.run' withGZip: false label: '"VisualWorks Installer for AIX"' script: ('./visual -noherald <1s> -installSelf' expandMacrosWith: self workingImage tail)] on: AbortPackaging do: [:ex | ^self]
packageSelfExtractorForHPUX "self packageSelfExtractorForHPUX" [| vm | vm := self engineForPlatformByte: 25. self packageFlatStructure: (Array with: vm with: self workingImage) into: 'VWInstallerHPUX.run' withGZip: false label: '"VisualWorks Installer for HPUX"' script: ('./visual -noherald <1s> -installSelf' expandMacrosWith: self workingImage tail)] on: AbortPackaging do: [:ex | ^self]
packageSelfExtractorForLinuxPPC "self packageSelfExtractorForLinuxPPC" [| vm | vm := self engineForPlatformByte: 42. self packageFlatStructure: (Array with: vm with: self workingImage) into: 'VWInstallerLinuxPPC.run' withGZip: true label: '"VisualWorks Installer for Linux PPC"' script: ('./visual -noherald <1s> -installSelf' expandMacrosWith: self workingImage tail)] on: AbortPackaging do: [:ex | ^self]
packageSelfExtractorForLinuxSPARC "self packageSelfExtractorForLinuxSPARC" [| vm | vm := self engineForPlatformByte: 43. self packageFlatStructure: (Array with: vm with: self workingImage) into: 'VWInstallerLinuxSPARC.run' withGZip: true label: '"VisualWorks Installer for Linux SPARC"' script: ('./visual -noherald <1s> -installSelf' expandMacrosWith: self workingImage tail)] on: AbortPackaging do: [:ex | ^self]
packageSelfExtractorForLinuxX86 "self packageSelfExtractorForLinuxX86" [| vm | self packagingDirectory: 'VWInstallerLinuxX86' asFilename. vm := self engineForPlatformByte: 40. self packageFlatStructure: (Array with: vm with: self workingImage) into: 'VWInstallerLinuxX86.run' withGZip: true label: '"VisualWorks Installer for Linux x86"' script: ('./visual -noherald <1s> -installSelf' expandMacrosWith: self workingImage tail)] on: AbortPackaging do: [:ex | ]. self packagingDirectory: nil
packageSelfExtractorForLinuxX86_64_64bit "self packageSelfExtractorForLinuxX86_64_64bit" true ifTrue: [^self]. "64 bit not working yet" [| vm | vm := self engineForPlatformByte: 64. self packagingDirectory: 'VWInstallerLinuxX86_64Bit' asFilename; create64BitImage; compressImage: self workingImage64; packageFlatStructure: (Array with: vm with: self workingImage64) into: 'VWInstallerLinuxX86_64_64Bit.run' withGZip: true label: '"VisualWorks Installer for Linux x86-64 64-bit"' script: ('./visual -noherald <1s> -installSelf' expandMacrosWith: self workingImage64 tail)] on: AbortPackaging do: [:ex | ]. self packagingDirectory: nil
packageSelfExtractorForSGI "self packageSelfExtractorForSGI" [| vm | vm := self engineForPlatformByte: 62. self packageFlatStructure: (Array with: vm with: self workingImage) into: 'VWInstallerSGI.run' withGZip: false label: '"VisualWorks Installer for SGI"' script: ('./visual -noherald <1s> -installSelf' expandMacrosWith: self workingImage tail)] on: AbortPackaging do: [:ex | ^self]
packageSelfExtractorForSolaris "self packageSelfExtractorForSolaris" [| vm | vm := self engineForPlatformByte: 29. self packageFlatStructure: (Array with: vm with: self workingImage) into: 'VWInstallerSolaris.run' withGZip: false label: '"VisualWorks Installer for Solaris"' script: ('./visual -noherald <1s> -installSelf' expandMacrosWith: self workingImage tail)] on: AbortPackaging do: [:ex | ^self]
packageSelfExtractorForSolarisX86 "self packageSelfExtractorForSolarisX86" [| vm | vm := self engineForPlatformByte: 29. self packageFlatStructure: (Array with: vm with: self workingImage) into: 'VWInstallerSolarisX86.run' withGZip: false label: '"VisualWorks Installer for Solaris x86"' script: ('./visual -noherald <1s> -installSelf' expandMacrosWith: self workingImage tail)] on: AbortPackaging do: [:ex | ^self]
</methods> <methods> Tools.RemoveNonEmptyDirectoryDialog <category>actions</category>
remove self resultHolder value: (self applyToAll value ifTrue: [#removeAll] ifFalse: [#remove]). self accept value: true
skip self resultHolder value: (self applyToAll value ifTrue: [#skipAll] ifFalse: [#skip]). self accept value: true
</methods> <methods> Tools.RemoveNonEmptyDirectoryDialog <category>initialize-release</category>
setMessageFor: aFilenameOrString self message value: (#removeNonEmptyDirectoryDialog << #installer >> 'The following directory is not empty:<nt><1s><n>Remove it with all its contents?' expandMacrosWith: aFilenameOrString asString)
</methods> <methods> VisualWorks.InstallMapAdjustor <category>private</category>
replaceApplicationVersion destinationStream nextPutAll: (sourceStream throughAll: '#applicationVersion -> '''''); nextPutAll: Win95SystemSupport currentVersion last; nextPut: $'. sourceStream upTo: $'
replaceImageSignature destinationStream nextPutAll: (sourceStream throughAll: '#imageSignature -> '); print: ObjectMemory imageSignature. sourceStream through: $]
replaceVariablePath destinationStream nextPutAll: (sourceStream throughAll: '#variablePath -> '); nextPutAll: self varPathString. sourceStream through: $)
varPathString | quoteString twoQuoteString | quoteString := String with: $'. twoQuoteString := String with: $' with: $'. ^Win95SystemSupport currentVersion printString copyReplaceAll: quoteString with: twoQuoteString
writeFile | fileStream | fileStream := filename writeStream. [fileStream nextPutAll: destinationStream contents] ensure: [fileStream close]
</methods> <methods> VisualWorks.InstallMapAdjustor <category>initialize-release</category>
filename: aFilename filename := aFilename
</methods> <methods> VisualWorks.InstallMapAdjustor <category>actions</category>
amend sourceStream := filename contentsOfEntireFile readStream. destinationStream := String new writeStream. self replaceApplicationVersion; replaceImageSignature; replaceVariablePath. destinationStream nextPutAll: sourceStream upToEnd. self writeFile
</methods> <methods> VisualWorks.InstallMapAdjustor class <category>instance creation</category>
amend: aStringOrFilename ^(self new) filename: aStringOrFilename asFilename; amend; yourself
</methods> <methods> VisualWorks.InstallerMainApplication <category>private</category>
allButtons ^#(#previous #defaultButton #cancel)
clearScanQueue scanQueue ifNil: [^self]. [scanQueue notEmpty] whileTrue: [scanQueue next]
commandLineReadStream ^OSHandle currentOS = #mac ifTrue: [ [(Object readFromString: (ObjectMemory imageFilename directory construct: 'macStartupOptions.txt') contentsOfEntireFile) readStream] on: Error do: [:ex | Array new readStream]] ifFalse: [self commandLine readStream]
displayStringForLocation: aURL | str | aURL ifNil: [^(#noSeedFile << #installer >> '<no seed file selected>') asString]. aURL isURI ifFalse: [^aURL asString]. str := String new writeStream. aURL printProtocolOn: str; printAuthorityOn: str. ^str contents
doInUIProcess: aBlock | win | self isHeadless ifTrue: [^aBlock value]. ^((win := self mainWindow) notNil and: [win isOpen]) ifTrue: [aBlock uiEventFor: win] ifFalse: [Dialog defaultParentWindow ifNil: aBlock ifNotNil: [aBlock uiEvent]]
doNowInUIProcess: aBlock | win | self isHeadless ifTrue: [^aBlock value]. ^((win := self mainWindow) notNil and: [win isOpen]) ifTrue: [aBlock uiEventNowFor: win] ifFalse: [Dialog defaultParentWindow ifNil: aBlock ifNotNil: [aBlock uiEventNow]]
installDirectoryVariableValue ^OSHandle currentOS = #win32 ifTrue: [self installDirectoryVariableValueWin] ifFalse: [self installDirectoryVariableValueGeneral]
installDirectoryVariableValueGeneral ^SystemUtils getEnvironmentVariable: (self installDirectoryVariableNameFor: self seedMap value)
installDirectoryVariableValueWin ^OSSystemSupport concreteClass new getVariableWithPath: self seedMap value variablePath name: (self installDirectoryVariableNameFor: self seedMap value) ifAbsent: [self installDirectoryVariableValueGeneral]
installerHome ^OSHandle currentOS = #win32 ifTrue: [self installerHomeWin] ifFalse: [self installerHomeGeneral]
installerHomeGeneral ^SystemUtils getEnvironmentVariable: self installerHomeVariableName
installerHomeWin | regPath | regPath := Win95SystemSupport currentVersion. ^OSSystemSupport concreteClass new getVariableWithPath: (regPath copyFrom: 1 to: regPath size - 1) name: self installerHomeVariableName ifAbsent: [self installerHomeGeneral]
nextBuildableIndexFrom: anInteger anInteger to: self screens list size do: [:i | | class subApp | class := self screens list at: i. subApp := self subAppInstanceOf: class. subApp okToBuild ifTrue: [^i]. subApp okToSkip ifFalse: [^anInteger - 1]]. ^nil
previousBuildableIndexFrom: anInteger (anInteger to: 1 by: -1) do: [:i | | class subApp | class := self screens list at: i. subApp := self subAppInstanceOf: class. subApp okToBuild ifTrue: [^i]. subApp okToSkip ifFalse: [^anInteger + 1]]. ^nil
refreshScreenList | newList selection newSelection | newList := self defaultSubapplications. self screens list = newList ifTrue: [^self]. selection := self screens selection. newSelection := (newList includes: selection) ifTrue: [selection] ifFalse: [newList first]. (self screens) list: newList asList; selection: newSelection
setInstallerHome: aString ^OSHandle currentOS = #win32 ifTrue: [self setInstallerHomeWin: aString] ifFalse: [SystemUtils setEnvironmentVariable: self installerHomeVariableName value: aString]
setInstallerHomeWin: aString | regPath | regPath := Win95SystemSupport currentVersion. ^OSSystemSupport concreteClass new setVariableWithPath: (regPath copyFrom: 1 to: regPath size - 1) key: self installerHomeVariableName value: aString
sourceVariableValue ^OSHandle currentOS = #win32 ifTrue: [self sourceVariableValueWin] ifFalse: [self sourceVariableValueGeneral]
sourceVariableValueGeneral ^SystemUtils getEnvironmentVariable: self class sourcePathVariableName
sourceVariableValueWin ^self seedMap value ifNil: [String new] ifNotNil: [:seed | OSSystemSupport concreteClass new getVariableWithPath: seed variablePath name: self sourcePathVariableName ifAbsent: [self sourceVariableValueGeneral]]
subApps ^subApps ifNil: [subApps := IdentityDictionary new]
versionCountRemoteInstall ^self seedMaps inject: 0 into: [:sum :map | sum + ((map location isURI and: [map errorEncountered not]) ifTrue: [1] ifFalse: [0])]
</methods> <methods> VisualWorks.InstallerMainApplication <category>accessing</category>
applicationName ^self seedMap value attributeNamed: #applicationName ifAbsent: nil
applicationVersion ^self seedMap value attributeNamed: #applicationVersion ifAbsent: [self class applicationVersion]
companyName ^self seedMap value attributeNamed: #companyName ifAbsent: [self class companyName]
componentSelectionPatterns ^self installOptions at: #componentSelectionPatterns ifAbsent: [self initializeComponentSelectionPatterns]
configFileLocation ^nil
configuration ^configuration ifNil: [configuration := Dictionary new]
configuration: aDictionary configuration := aDictionary
configurationAt: aKey ^self configuration at: aKey ifAbsent: nil
configurationAt: aKey at: subKey ^(self configurationAt: aKey) ifNil: [nil] ifNotNil: [:dictionary | dictionary at: subKey ifAbsent: nil]
currentSubApp | class | (class := self screens selection) ifNil: [^class]. ^self subAppInstanceOf: class
currentVersionString ^self class currentVersionString
defaultConfigFileTail ^'installerConfiguration.xml'
defaultTargetTail ^self seedMap value attributeNamed: #defaultTargetTail ifAbsent: [Array with: self class installDirectory]
force ^self installOptions at: #force ifAbsent: [false]
handsFree ^self installOptions at: #handsFree ifAbsent: [false]
hm ^self installDirectory value
imageSignature ^self seedMap value attributeNamed: #imageSignature ifAbsent: [ObjectMemory imageSignature]
initializeComponentSelectionPatterns ^self installOptions at: #componentSelectionPatterns put: OrderedCollection new
installDirectoryVariableName ^self installDirectoryVariableNameFor: self seedMap value
installDirectoryVariableNameFor: aSeedMap ^aSeedMap ifNil: [self class installDirectoryVariableName] ifNotNil: [aSeedMap attributeNamed: #installDirectoryVariableName ifAbsent: [self class installDirectoryVariableName]]
installerHomeVariableName ^'VWINSTALLER'
installerName ^(#cincomSmalltalkInstaller << #installer >> 'Cincom Smalltalk Installer') expandMacros
installOptions ^installOptions ifNil: [installOptions := IdentityDictionary new]
installSource ^self installSourceFor: self seedMap value
installSourceFor: aSeedFile ^aSeedFile ifNil: [self sourceVariableValue] ifNotNil: [aSeedFile location directory]
macTypeCreatorByExtension | defaultTextAttributes | defaultTextAttributes := Array with: 'TEXT' with: ' '. ^(Dictionary new) at: '.text' put: defaultTextAttributes; at: '.txt' put: defaultTextAttributes; at: '.html' put: defaultTextAttributes; at: '.htm' put: defaultTextAttributes; yourself
plat "Get this value from the seed file. If not found, there is no VM component available to install for this platform, so answer an empty collection." | value | value := self seedMap value dynamicAttributes at: ObjectMemory platformByte ifAbsent: [^Array new]. "Backward compatability: If the seed file answers a string instead of a collection, get the value from my class." value isString ifTrue: [^self class currentVmPlatDir]. ^value last
scanProcesses ^scanProcesses ifNil: [scanProcesses := Dictionary new]
screens ^screens ifNil: [screens := SelectionInList new]
seedFile self undecided ifTrue: [^nil]. ^self forInstall ifTrue: [self seedMap value] ifFalse: [self seedLog value]
seedFile: aSeedFile "Make aSeedFile the newly selected seedFile (seedMap or seedLog). If aSeedFile is not already in the list of selectable seedFiles, add it. If aSeedFile is already the selected seedFile, do not update the model." self undecided ifTrue: [^self]. self forInstall ifTrue: [self seedMap value: (self seedMaps addIfAbsent: aSeedFile)] ifFalse: [self seedLog value: (self seedLogs addIfAbsent: aSeedFile)]
seedLogs ^seedLogs ifNil: [seedLogs := List new]
seedMaps ^seedMaps ifNil: [seedMaps := List new]
sourcePathVariableName ^self seedMap value attributeNamed: #sourcePathVariableName ifAbsent: [self class sourcePathVariableName]
subAppInstanceOf: aClass ^self subApps at: aClass ifAbsentPut: [aClass parent: self]
tgtCmps ^self tgtDir components
tgtDir ^tgtDir ifNil: [self resetTarget]
tgtString ^self installDirectory value
updateApplied ^updateApplied ifNil: [updateApplied := false]
updateApplied: aBoolean updateApplied := aBoolean
workingDirectoryFrom: anExpandablePath ^anExpandablePath isEmpty ifTrue: [(self tgtDir construct: 'image') asString] ifFalse: [anExpandablePath asResolvedStringWith: self]
</methods> <methods> VisualWorks.InstallerMainApplication <category>actions</category>
cancel self currentSubApp ifNotNil: [:subApp | subApp okToCancel ifFalse: [^self]]. self subApps do: [:subApp | subApp cancel]. self closeRequest. [Cancel raiseSignal] on: UnhandledException do: [:ex | ]
checkServer self serverChecked value ifTrue: [^self]. self serverChecked value: true. self readDefaultConfigFile
defaultButtonAction self currentSubApp defaultAction
next | index newIndex | self currentSubApp okToProceed ifFalse: [^false]. index := self screens selectionIndex. index < self screens list size ifFalse: [^self quit]. (newIndex := self nextBuildableIndexFrom: index + 1) ifNil: [^self quit]. self screens selectionIndex: newIndex. self setCanvas. ^true
previous | index newIndex | index := self screens selectionIndex. index = 1 ifTrue: [^self]. (newIndex := self previousBuildableIndexFrom: index - 1) ifNil: [^self quit]. self screens selectionIndex: newIndex. self setCanvas
quit self closeRequest
runHeadless self refreshScreenList. self currentSubApp runHeadless. HeadlessError raiseSignal
selectFirstMap self seedMap value: (self seedMaps isEmpty ifTrue: [nil] ifFalse: [self seedMaps first])
showCommandLineHelp | helpText | helpText := (#installerCommandLineHelpText << #installer >> 'Installer Command-Line Options: -+, -include PATTERN [PATTERN2 [...]] Ensure components whose names match PATTERN are selected for installation. See PATTERN detail below. --, -exclude PATTERN [PATTERN2 [...]] Ensure components whose names match PATTERN are not selected for installation. See PATTERN detail below. ------ PATTERNs containing whitespace characters must be delimited by quotes (single or double). Later patterns override earlier ones, so this example will select all non-VM components and only the AIX VM: -+ * --"VM *" -include ''VM AIX'' -?, -help, --help Display this help text and then quit. -force Force uninstall of modified files and non-empty directories. -handsFree Proceed with installation without user intervention. Where options are not specified on the command line, default values will be used. -installMap "FILE" Select FILE as the default install.map describing the product to install. FILE may be a normal file or an FTP URL. For example: ftp://myServer.com/myPath/install.map installs from archives on the server, as specified in the remote install.map file. -nogui Install in the background; display no window. This option forces -handsFree behavior. -options "FILE" Read FILE and process its contents as though reading from the command line. Except for -nogui, which only works from the command line, all options listed here can appear directly on the command line or in FILE. -target "DIRECTORY" Set DIRECTORY as the target installation directory. If left unspecified for a -handsFree install, the value may vary depending on platform and $VISUALWORKS, if defined. Use -listOptions to see what DIRECTORY will be used if -target is not specified. -test Display summary of options and then quit. Useful for testing command line options without actually [un]installing anything. -uninstallLog "FILE" Select FILE as the default uninstal.log file describing the previous installation to be removed.') expandMacros. Screen default putExternalSelection: helpText. self isHeadless ifFalse: [Dialog report: helpText]. (self stdout) cr; nextPutAll: helpText; cr. self cancel
showSummary | summaryText | summaryText := #summaryTextHeader << #installer >> '-test<nn>Summary:<n><1s>' expandMacrosWith: (self summarySubapplication parent: self) verboseText. Screen default putExternalSelection: summaryText. self isHeadless ifFalse: [Dialog report: summaryText]. (self stdout) cr; nextPutAll: summaryText; cr. self cancel
</methods> <methods> VisualWorks.InstallerMainApplication <category>initialize-release</category>
addInclusion: aBoolean patternsFrom: aReadStream [aReadStream atEnd] whileFalse: [aReadStream peek first = $- ifTrue: [^self]. self componentSelectionPatterns add: (InclusionPattern include: aBoolean pattern: aReadStream next)]
availableParcelUpdates | parcelURLs cfgURL dir | parcelURLs := OrderedCollection new. (cfgURL := self configFileLocation) ifNil: [^parcelURLs]. dir := cfgURL directory. (self configurationAt: cfgURL at: 'installerParcelVersions') ifNotNil: [:versions | versions do: [:array | | pcl | pcl := Parcel parcelNamed: array first. (pcl isNil or: [pcl versionString ~= (array at: 2)]) ifTrue: [parcelURLs add: (array last inject: dir into: [:d :path | d construct: path])]]]. ^parcelURLs
fromLiteralArrayEncoding: anArray 2 to: anArray size by: 2 do: [:i | self perform: (anArray at: i) with: (anArray at: i + 1)]
initialize super initialize. self processCommandLine. self searchForSeedFiles. self isInteractive ifFalse: [self checkSeedForHandsFree]. self isHeadless ifTrue: [self runHeadless]. self refreshScreenList
newInstallerAvailable ^(self configurationAt: self configFileLocation at: 'installerImageVersion') ifNil: [false] ifNotNil: [:availableVersionString | self currentVersionString ~= availableVersionString]
newOptions ^InstallOptions new
processCommandLine self processOptionStream: self commandLineReadStream. self shouldShowSummary ifTrue: [self showSummary]
processOptionStream: aReadStream "See #showCommandLineHelp for details on these options." [aReadStream atEnd] whileFalse: [| option | option := aReadStream next asLowercase. (#('-+' '-include') includes: option) ifTrue: [self addInclusion: true patternsFrom: aReadStream]. (#('--' '-exclude') includes: option) ifTrue: [self addInclusion: false patternsFrom: aReadStream]. (#('-?' '-help' '--help') includes: option) ifTrue: [self showCommandLineHelp]. option = '-force' ifTrue: [self installOptions at: #force put: true]. (#('-handsfree' '-nogui') includes: option) ifTrue: [self installOptions at: #handsFree put: true]. option = '-installmap' ifTrue: [self setCommandLineSeedMap: aReadStream next]. option = '-options' ifTrue: [self processOptionStream: (self streamTokens: aReadStream next asFilename)]. option = '-target' ifTrue: [self setCommandLineTarget: aReadStream next]. option = '-test' ifTrue: [self installOptions at: #showSummary put: true]. option = '-uninstalllog' ifTrue: [self setCommandLineSeedLog: aReadStream next]]
selectComponentsFor: aSeedFileOrNil | cmpList selectionFlags patterns | aSeedFileOrNil ifNil: [^nil]. aSeedFileOrNil isInitialized ifFalse: [^nil]. cmpList := aSeedFileOrNil componentList. selectionFlags := Array new: cmpList size withAll: false. aSeedFileOrNil defaultSelections do: [:cmp | selectionFlags at: (cmpList indexOf: cmp) put: true]. patterns := self componentSelectionPatterns. 1 to: cmpList size do: [:i | | name | name := (cmpList at: i) name. "The last matching pattern wins, so process patterns backward only to the first match." ((patterns size to: 1 by: -1) detect: [:p | (patterns at: p) match: name] ifNone: nil) ifNotNil: [:p | selectionFlags at: i put: (patterns at: p) include]]. ^((1 to: cmpList size) select: [:i | selectionFlags at: i]) collect: [:i | cmpList at: i]
setCommandLineSeedLog: aString | logFile log | logFile := PortableFilename named: aString. logFile isRelative ifTrue: [logFile := (Filename components: logFile asResolvedString) inject: Filename defaultDirectory into: [:dir :path | dir construct: path]]. log := self seedLogs detect: [:uLog | uLog location = logFile] ifNone: [InstallLog on: logFile asFilename]. self installOptions at: #commandLineSeedLog put: log. self installAction value: #Uninstall. self seedFile: log
setCommandLineSeedMap: aString | mapFile map | mapFile := InstallMap locationFromString: aString. map := self seedMaps detect: [:instMp | instMp location = mapFile] ifNone: [self mapFrom: mapFile checkNotReady: false]. map ifNil: [^self]. self installOptions at: #commandLineSeedMap put: map. map forkEnsureFileScan. self installAction value: #Install. self seedFile: map
setCommandLineTarget: aString self installOptions at: #commandLineTarget put: aString. self installDirectory value: aString
setErrorLogPath #{RuntimePackager.RuntimeManager} ifDefinedDo: [:class | | path tail | (path := class logicalFileSpecFrom: class errorLogPath) ifNil: [path := 'error.log']. tail := path asFilename tail. class errorLogPath: (self tgtDir construct: tail) asString]
setLogForUninstall | newLog | ((newLog := self seedLog value) notNil and: [newLog location directory = self tgtDir]) ifTrue: [self seedLog value applicationName: self seedMap value fullName] ifFalse: [self seedLog value: (InstallLog in: self tgtDir named: self seedMap value fullName)]
setWindowTitle self mainWindow label: self installerName
streamTokens: aFilename "Tokenize contents of aFilename based on separators and answer a readStream on the tokens. Tokens are separated by whitespace. Single or double quotes are used as delimiters for patterns that contain whitespace characters. If a delimited token contains an embedded delimiter character, it should be escaped by itself. Consider a pattern containing the movie title Logan's Run. Using a single quote character as the delimiter, the token would be represented in the file as: 'Logan''s Run' The first single quote marks the start of the token, and characters are read up to the second. The escaped character triggers a subsequent read, which is handled by the #whileTrue: loop. All delimiters are discarded, so an embedded delimiter requires an explicit write to preserve it in the token, which is done at the end of the #whileTrue: argument block." | tokens readStream | tokens := OrderedCollection new. readStream := aFilename contentsOfEntireFile readStream. [readStream skipSeparators; atEnd] whileFalse: [| token char | token := String new writeStream. char := readStream peek. (#($' $") includes: char) ifTrue: [[readStream peek = char] whileTrue: [readStream next. token nextPutAll: (readStream upTo: char). readStream peek = char ifTrue: [token nextPut: char]]] ifFalse: [token nextPutAll: readStream upToSeparator]. tokens add: token contents]. ^tokens readStream
suggestInstallDirectory ^self suggestInstallDirectoryFor: self seedMap value
suggestInstallDirectoryFor: aSeedMap | var varName | self commandLineTarget ifNotNil: [:tgtString | ^tgtString]. aSeedMap ifNil: [^String new]. varName := self installDirectoryVariableNameFor: aSeedMap. ^(var := OSHandle currentOS == #win32 ifTrue: [OSSystemSupport concreteClass new getVariableWithPath: aSeedMap variablePath name: varName ifAbsent: [String new]] ifFalse: [SystemUtils getEnvironmentVariable: varName]) isEmpty ifTrue: [(self defaultTargetTail inject: self baseDirectoryForPlatform asFilename into: [:fn :string | fn construct: string]) asString] ifFalse: [var]
updateAvailable ^self newInstallerAvailable or: [self availableParcelUpdates isEmpty not]
</methods> <methods> VisualWorks.InstallerMainApplication <category>gui testing</category>
dynamicReferencesTest ^self
</methods> <methods> VisualWorks.InstallerMainApplication <category>testing</category>
checkExistsWithNotReadyRetry: aFilename | tries | tries := 0. ^[aFilename exists] on: Error do: [:ex | ex signal == OSErrorHolder notReadySignal ifFalse: [false] ifTrue: [(tries := tries + 1) odd ifTrue: [(Delay forSeconds: 2) wait. ex restart] ifFalse: [(self retryDeviceNotReadyDialog: aFilename) ifTrue: [ex restart] ifFalse: [false]]]]
finishWork [self currentSubApp finishWork] on: MessageNotUnderstood do: [:ex | ]
forInstall ^self installAction value = #Install
forUninstall ^self installAction value = #Uninstall
isExpressInstall ^self installAction value = #Install and: [self expressInstall value]
isInteractive ^self isHeadless not and: [self handsFree not]
nextPageIsAction | nextPageIndex | nextPageIndex := self nextBuildableIndexFrom: self screens selectionIndex + 1. ^nextPageIndex notNil and: [(self subAppInstanceOf: (self screens list at: nextPageIndex)) isActionPage]
scanning ^self scanProcesses notEmpty
shouldShowSummary ^self installOptions at: #showSummary ifAbsent: [false]
undecided ^self installAction value isNil
</methods> <methods> VisualWorks.InstallerMainApplication <category>interface opening</category>
defaultSubapplications (self isInteractive and: [self screens list isEmpty]) ifTrue: [^self initialSubapplications]. ^self forUninstall ifTrue: [self subapplicationsForUninstall] ifFalse: [self subapplicationsForInstall]
initialSubapplications ^List with: ActionSelectorPage with: CheckServerPage
openInterface: aSymbol withPolicy: aPolicy inSession: anApplicationContext ^ [super openInterface: aSymbol withPolicy: aPolicy inSession: anApplicationContext] on: Cancel , HeadlessError do: [:ex | ]
postBuildWith: aBuilder super postBuildWith: aBuilder. self mainWindow maximumSize: self mainWindow maximumSize x @ (Screen default bounds extent y - 20). self components selectionIndexHolder onChangeSend: #changedComponentSelections to: self. self setWindowTitle. self setDefaultButtonLabel
postOpenWith: aBuilder super postOpenWith: aBuilder. self mainWindow damageRepairPolicy: DoubleBufferingWindowDisplayPolicy new. self setCanvas
setCanvas | subApp subBuilder spec | subApp := self currentSubApp. spec := subApp class interfaceSpecFor: #subcanvasSpec. [subBuilder := subApp builder ifNil: [self builder newSubBuilder]. (self builder componentAt: #subcanvas) widget client: subApp spec: spec builder: subBuilder. self checkButtons] on: HeadlessError do: [:ex | ]. subApp postOpenWith: subBuilder
subapplicationsForHandsFreeInstall ^List with: InstallerPage
subapplicationsForHandsFreeUninstall ^List with: UninstallerPage
subapplicationsForInstall ^self isInteractive ifTrue: [self subapplicationsForInteractiveInstall] ifFalse: [self subapplicationsForHandsFreeInstall]
subapplicationsForInteractiveInstall ^(List new) add: ActionSelectorPage; add: CheckServerPage; add: SeedSelectorPage; add: ChooseDirectoryPage; add: ComponentSelectorPage; add: SummaryPage; add: LicenseVerifierPage; add: InstallerPage; add: ThanksPage; yourself
subapplicationsForInteractiveUninstall ^(List new) add: ActionSelectorPage; add: CheckServerPage; add: SeedSelectorPage; add: ComponentSelectorPage; add: SummaryPage; add: UninstallerPage; add: ThanksPage; yourself
subapplicationsForUninstall ^self handsFree ifTrue: [self subapplicationsForHandsFreeUninstall] ifFalse: [self subapplicationsForInteractiveUninstall]
summarySubapplication ^SummaryPage
</methods> <methods> VisualWorks.InstallerMainApplication <category>updating</category>
changedComponentSelections self canWriteOptions ifTrue: [self writeSelectionsToOptions]
changedConfigurationFor: aURL | configStrings | self mergeMapsFromURL: aURL. (configStrings := self configurationAt: aURL at: 'additionalConfigFiles') ifNil: [^self]. (configStrings isEmpty not and: [self serverChecked value not]) ifTrue: [self serverChecked value: true. self readDefaultConfigFile]. configStrings do: [:urlString | | url | (url := urlString asRemoteOrLocalFile) isURI ifTrue: [url setServerPassive; ensureInstallerLogin]. self configuration at: url ifAbsent: [self forkReadConfigFile: url]]
changedInstallAction self installAction value = #Uninstall ifTrue: [self expressInstall value: false. self seedLog changed] ifFalse: [self seedMap changed]
changedInstallDirectory self resetTarget. self canWriteOptions ifTrue: [self writeInstallDirectoryToOptions]
changedSeedLog self forUninstall ifTrue: [self readCurrentSeedOptions]
changedSeedMap self seedMap value isInitialized ifFalse: [self seedMap value forkEnsureFileScan]. self forInstall ifTrue: [self readCurrentSeedOptions]
checkButtons | visibleButtons enabledButtons | visibleButtons := self currentSubApp visibleButtons. enabledButtons := self currentSubApp enabledButtons. self screens selectionIndex = 1 ifTrue: [enabledButtons := enabledButtons copyWithout: #previous]. self allButtons do: [:symbol | | visibility enablement wrapper | visibility := visibleButtons includes: symbol. enablement := visibility and: [enabledButtons includes: symbol]. wrapper := builder componentAt: symbol. (wrapper isVisible xor: visibility) ifTrue: [wrapper isVisible: visibility]. (wrapper isEnabled xor: enablement) ifTrue: [wrapper isEnabled: enablement]. (visibility and: [symbol = #defaultButton]) ifTrue: [wrapper widget labelString: self currentSubApp defaultButtonLabel]]
checkForPreviousInstallation | map directory | (map := self seedMap value) ifNil: [^false]. map waitForUpdates. self processOutstandingEvents. directory := self tgtDir. directory ifNil: [directory := self suggestInstallDirectoryFor: map]. ^(InstallLog oldIn: directory) notNil
disableDefaultButton (self wrapperAt: #defaultButton) ifNotNil: [:wrapper | wrapper isEnabled ifTrue: [wrapper isEnabled ifTrue: [wrapper isEnabled: false]]]
disableInitialScreens: anInteger | currentScreenIndex newInitialScreenIndex newSelectionIndex | currentScreenIndex := self screens selectionIndex. newInitialScreenIndex := currentScreenIndex + anInteger. newInitialScreenIndex < 2 ifTrue: [^self]. self screens list size < newInitialScreenIndex ifTrue: [^self]. self screens list: (self screens list copyFrom: newInitialScreenIndex to: self screens list size). newSelectionIndex := self nextBuildableIndexFrom: (currentScreenIndex - newInitialScreenIndex + 1 max: 1). newSelectionIndex ifNil: [^self quit]. self screens selectionIndex: newSelectionIndex. anInteger isZero ifFalse: [self setCanvas]
disablePreviousButton (self wrapperAt: #previous) ifNotNil: [:wrapper | wrapper isEnabled ifTrue: [wrapper isEnabled ifTrue: [wrapper isEnabled: false]]]
enableDefaultButton (self wrapperAt: #defaultButton) ifNotNil: [:wrapper | wrapper isEnabled ifFalse: [wrapper isEnabled: true]]
enablePreviousButton (self wrapperAt: #previous) ifNotNil: [:wrapper | wrapper isEnabled ifFalse: [wrapper isEnabled: true]]
processOutstandingEvents self isHeadless ifFalse: [self mainWindow windowManager processOutstandingEvents]
resetTarget self forInstall ifFalse: [^self]. ^tgtDir := self installDirectory value ifNotNil: [:string | string asFilename]
restart | debugValue | self class openInitializedFrom: self. debugValue := self class debugging. self class debugging: true. self quit. [] uiEventNow. self class debugging: debugValue
setDefaultButtonLabel self setDefaultButtonLabelString: self currentSubApp defaultButtonLabel
setDefaultButtonLabelString: aStringOrText (self widgetAt: #defaultButton) ifNotNil: [:widget | widget labelString: aStringOrText]
suggestInitialAction self commandLineSeedMap ifNotNil: [^self]. self commandLineSeedLog ifNotNil: [^self]. self selectFirstMap. (self expressInstall value or: [self seedMap value notNil]) ifTrue: [^self installAction value: #Install]. self seedLog value ifNotNil: [self installAction value: #Uninstall]
update: anAspect with: aParameter from: anObject anAspect = #status ifTrue: [self doInUIProcess: [self changed: #seedStatus with: aParameter. self suggestSeedOptionsFor: anObject. anObject = self seedFile ifTrue: [self readCurrentSeedOptions]]]
</methods> <methods> VisualWorks.InstallerMainApplication <category>private-seed files</category>
commandLineSeedLog ^self installOptions at: #commandLineSeedLog ifAbsent: [nil]
commandLineSeedMap ^self installOptions at: #commandLineSeedMap ifAbsent: [nil]
commandLineTarget ^self installOptions at: #commandLineTarget ifAbsent: [nil]
expectedLogs ^(List new) addIfAbsent: (InstallLog oldIn: Filename defaultDirectory); addIfAbsent: self logFromEnvironment; yourself
expectedMaps ^(List new) addIfAbsent: self commandLineSeedMap; addIfAbsent: self mapFromCurrentDirectory; addIfAbsent: self mapFromEnvironment; copyWithout: nil
forkReadConfigFile: aURL self scanQueue nextPut: aURL. self scanProcesses at: aURL put: ( [self changed: #readConfigFileStart; readConfigFile: aURL; changed: #readConfigFileEnd] forkAt: Processor userSchedulingPriority - 1). self disableDefaultButton
log: anInstallLogOrNil | newLog | newLog := anInstallLogOrNil. newLog notNil ifTrue: [newLog := self seedLogs addIfAbsent: newLog]. self seedLog value = newLog ifTrue: [^self]. self seedLog value: newLog
logFromEnvironment "Look for uninstal.log in the directory specified by sourceVariableValue." | var | (var := self installDirectoryVariableValue) isEmpty ifTrue: [^nil]. ^InstallLog oldIn: var asFilename
mapFrom: aFilenameOrURI checkNotReady: aBoolean | newMap | (aBoolean and: [(self checkExistsWithNotReadyRetry: aFilenameOrURI) not]) ifTrue: [^nil]. (aFilenameOrURI isURI or: [aFilenameOrURI exists]) ifFalse: [^nil]. newMap := self seedMaps detect: [:map | map location = aFilenameOrURI] ifNone: [InstallMap on: aFilenameOrURI named: nil for: self]. newMap isRemote ifFalse: [newMap forkEnsureFileScan]. ^newMap
mapFromCurrentDirectory "Look for install.map in the current directory." ^self mapFromDirectory: Filename defaultDirectory checkNotReady: true
mapFromDirectory: aDirectory checkNotReady: aBoolean "Look for install.map in aDirectory." ^self mapFrom: (aDirectory construct: InstallMap defaultLocationTail) checkNotReady: aBoolean
mapFromEnvironment "Since the installer is no longer bound to the product being installed, it will not read the appropriate value on Windows because it has no way to anticipate which registry key it should search. Obsoleting this method." ^nil "Look for install.map in the directory specified by sourceVariableValue." "| var | (var := self sourceVariableValue) isEmpty ifTrue: [^nil]. ^[self mapFromDirectory: var asRemoteOrLocalFile checkNotReady: false] warnFileErrorsUsing: self mainWindow"
mergeMapsFromURL: aURL "aURL represents a (possibly remote) config file which may specify applications available to install. If so, these have been named in the 'configuration' dictionary. Add these to 'foundMaps' for user selection." (self configurationAt: aURL at: 'applicationsToInstall') ifNotNil: [:paths | | directory | directory := aURL directory. paths do: [:array | | mapFile | mapFile := (directory construct: array last) construct: InstallMap defaultLocationTail. self seedMaps addFirstIfAbsent: (self seedMaps detect: [:map | map location = mapFile] ifNone: [InstallMap on: mapFile named: array first for: self])]. self moveUpLocalMap]
moveUpLocalMap | topMap index topName | (topMap := self seedMaps first) isRemote ifFalse: [^self]. topName := topMap fullName. index := (2 to: self seedMaps size) detect: [:i | | map | map := self seedMaps at: i. map fullName = topName and: [map isRemote not]] ifNone: [^self]. self seedMaps addFirst: (self seedMaps removeAtIndex: index)
readConfigFile: aURL [ [| saxDriver | saxDriver := InstallerSAXDriver configuration: (self configuration at: aURL put: Dictionary new). (saxDriver newParser) handlers: saxDriver; validate: false; parse: aURL] on: Error , Net.FTPSignal do: [:ex | ex return]] ensure: [self doNowInUIProcess: [self changedConfigurationFor: aURL]. self scanProcesses removeKey: aURL ifAbsent: nil]
readDefaultConfigFile | url | (url := self configFileLocation) ifNil: [^self]. self forkReadConfigFile: url
readLocalConfigFile | dirString configFile | dirString := self installerHome. configFile := (dirString isEmpty ifTrue: [Filename defaultDirectory] ifFalse: [dirString asFilename]) construct: self defaultConfigFileTail. ((self configurationAt: configFile) isNil and: [configFile exists]) ifTrue: [self readConfigFile: configFile]
searchForLogs [self seedLogs addAllIfAbsent: (self expectedLogs select: [:ea | ea notNil]). self changed: #seedStatus] forkAt: Processor userSchedulingPriority - 3
searchForMaps self seedMaps addAllIfAbsent: (self expectedMaps select: [:ea | ea notNil])
searchForSeedFiles (self handsFree and: [self seedFile notNil]) ifTrue: [^self]. self searchForMaps; searchForLogs; readLocalConfigFile; suggestInitialAction
</methods> <methods> VisualWorks.InstallerMainApplication <category>dialogs</category>
errorReadingSeedFileDialog Dialog warn: (#errorReadingSeedFileDialog << #installer >> 'There was an error reading:<nt><1s><n>Please select another file.' expandMacrosWith: self seedFile location asString). ^false
invalidSeedFileDialog Dialog warn: ((self forInstall ifTrue: [#invalidMapFileDialog << #installer >> 'The specified file is not a valid install.map file:<nt><1s>'] ifFalse: [#invalidLogFileDialog << #installer >> 'The specified file is not a valid uninstal.log file:<nt><1s>']) expandMacrosWith: self seedFile location asString). ^false
noComponentsSelectedDialog Dialog warn: #noComponentsSelectedDialog << #installer >> 'No components selected!<n>Please select component(s)<n>or click ''Back'' and change options.' expandMacros
noSeedSelectedDialog Dialog warn: (self forInstall ifTrue: [#noMapSelectedDialog << #installer >> 'Please select a valid install.map file.'] ifFalse: [#noLogSelectedDialog << #installer >> 'Please select a valid uninstal.log file.']). ^false
retryDeviceNotReadyDialog: aFilename ^self doNowInUIProcess: [Dialog confirm: (#retryDeviceNotReadyDialog << #installer >> 'This device is not ready:<nt><s1><n>Try again?' expandMacrosWith: aFilename asString)]
</methods> <methods> VisualWorks.InstallerMainApplication <category>aspects</category>
components ^components ifNil: [components := MultiSelectionInList new]
desktopShortcut ^desktopShortcut ifNil: [desktopShortcut := true asValue]
expressInstall ^expressInstall ifNil: [expressInstall := LazyValueHolder with: true]
installAction ^installAction ifNil: [installAction := (LazyValueHolder new) onChangeSend: #changedInstallAction to: self; yourself]
installDirectory ^installDirectory ifNil: [installDirectory := (LazyValueHolder new) onChangeSend: #changedInstallDirectory to: self; yourself]
scanQueue ^scanQueue ifNil: [scanQueue := SharedQueue new]
seedFiles self undecided ifTrue: [^List new]. ^self forInstall ifTrue: [self seedMaps] ifFalse: [self seedLogs]
seedLog ^seedLog ifNil: [seedLog := (LazyValueHolder new) onChangeSend: #changedSeedLog to: self; yourself]
seedMap ^seedMap ifNil: [seedMap := (LazyValueHolder new) onChangeSend: #changedSeedMap to: self; yourself]
serverChecked ^serverChecked ifNil: [serverChecked := false asValue]
</methods> <methods> VisualWorks.InstallerMainApplication <category>events</category>
noticeOfWindowClose: aWindow super noticeOfWindowClose: aWindow. self seedMaps do: [:map | map terminateScan]. aWindow == self mainWindow ifFalse: [^self]. self currentSubApp noticeOfWindowClose: aWindow. self class debugging ifTrue: [ScheduledWindow scheduledControllers size = 1 ifTrue: [VisualLauncher open]] ifFalse: [ObjectMemory quit]
</methods> <methods> VisualWorks.InstallerMainApplication <category>inquiries</category>
baseDirectoryForPlatform ^self perform: OSHandle currentOS
bytesRequired ^self components selections inject: 0 into: [:subtotal :component | component currentSize ifNotNil: [subtotal + component currentSize]]
checkSeedForHandsFree | errorText | self seedFile ifNotNil: [^self]. errorText := (#checkSeedForHandsFreeText << #installer >> 'Seed file required to run handsfree - No seed file specified on command line') asString. Screen default putExternalSelection: errorText. self isHeadless ifFalse: [Dialog warn: errorText]. (self stdout) cr; nextPutAll: errorText; cr. self cancel
mac ^Filename volumes first , 'Applications:'
unix | home | ^(home := SystemUtils getEnvironmentVariable: 'HOME') isEmpty ifTrue: ['/'] ifFalse: [home]
validSeedFile self undecided ifTrue: [^false]. self seedFile ifNil: [^self noSeedSelectedDialog]. self seedFile errorEncountered ifTrue: [^self errorReadingSeedFileDialog]. ^self seedFile external or: [((self seedFile) waitForUpdates; isInitialized) or: [self invalidSeedFileDialog]]
win32 | wss | wss := OSSystemSupport concreteClass new. ^((wss getVariableWithPath: #('SOFTWARE' 'Microsoft' 'Windows' 'CurrentVersion') name: 'ProgramFilesDir' ifAbsent: [String new]) asFilename construct: self companyName asString) asString
</methods> <methods> VisualWorks.InstallerMainApplication <category>debug</category>
commandLine ^CEnvironment commandLine
isHeadless ^HeadlessImage isHeadless
stdout ^OS.Stdout
</methods> <methods> VisualWorks.InstallerMainApplication <category>options</category>
canWriteOptions ^self seedFile notNil and: [self seedFile isInitialized]
currentSeedOptions ^self seedFile ifNotNil: [:seed | self installOptions at: seed ifAbsentPut: [self newOptions]]
ensureOptions self seedFile ifNil: [^self] ifNotNil: [:seed | seed isInitialized ifFalse: [seed forkEnsureFileScan; waitForUpdates]]. self processOutstandingEvents. self readCurrentSeedOptions
initializeCurrentSeedOptions ^self seedFile ifNotNil: [:seed | self installOptions at: seed put: self newOptions]
readCurrentSeedOptions self readInstallDirectoryFromOptions. self readSelectionsFromOptions
readInstallDirectoryFromOptions self installDirectory value: (self currentSeedOptions installDirectoryOr: [self suggestInstallDirectory]). self resetTarget
readSelectionsFromOptions | seed newList selections | seed := self seedFile. seed ifNil: [newList := List new. selections := OrderedCollection new] ifNotNil: [newList := seed componentList. selections := self currentSeedOptions selectionsOr: [self selectComponentsFor: seed]]. self components setList: newList selecting: selections
saveInstallOptionsOn: aStream aStream nextPutAll: '-handsFree'. aStream cr; nextPutAll: '-installMap'; crtab; nextPut: $"; nextPutAll: self seedMap value location asString; nextPut: $". aStream cr; nextPutAll: '-target'; crtab; nextPut: $"; nextPutAll: self tgtDir asString; nextPut: $". self saveSelectionsOn: aStream
saveOptions | file stream | file := self saveOptionsDialog ifNil: [^self]. stream := file writeStream. [self forInstall ifTrue: [self saveInstallOptionsOn: stream] ifFalse: [self saveUninstallOptionsOn: stream]] ensure: [stream close]. Dialog warn: (#optionsSavedDialog << #installer >> 'Your current options have been saved.<n>To use these options in the future,<n>invoke the installer with these additional arguments:<nt>-options "<1s>"' expandMacrosWith: file asString)
saveOptionsDialog "Answer the file to which options will be saved, or nil if canceled." | dialog | dialog := OpenFileDialog new. dialog addFilterForAllFiles. dialog fileCondition: #any. dialog parentWindow: self mainWindow. dialog defaultFilename: 'options.txt' asFilename. dialog open ifFalse: [^nil]. ^dialog selectionString asFilename
saveSelectionsOn: aStream | selectionIndexes selectedComponents unselectedComponents list | selectionIndexes := self components selectionIndexes. selectedComponents := OrderedCollection new. unselectedComponents := OrderedCollection new. list := self components list. 1 to: list size do: [:i | ((selectionIndexes includes: i) ifTrue: [selectedComponents] ifFalse: [unselectedComponents]) add: (list at: i)]. aStream cr; nextPutAll: '-include'; crtab. selectedComponents do: [:cmp | aStream print: cmp name] separatedBy: [aStream crtab]. aStream cr; nextPutAll: '-exclude'; crtab. unselectedComponents do: [:cmp | aStream print: cmp name] separatedBy: [aStream crtab]
saveUninstallOptionsOn: aStream aStream nextPutAll: '-handsFree'. aStream cr; nextPutAll: '-uninstallLog'; crtab; nextPut: $"; nextPutAll: self seedLog value location asString; nextPut: $". self saveSelectionsOn: aStream
suggestInstallObjectStudioFor: aSeedFile ^aSeedFile forInstall and: [self normalExit and: [self handsFree not and: [self isHeadless not and: [self canInstallObjectStudioFromPath: (self osSetupPathFor: aSeedFile) seed: aSeedFile]]]]
suggestSeedOptionsFor: seedFile | options | options := self installOptions at: seedFile ifAbsentPut: [self newOptions]. options installDirectory: (self suggestInstallDirectoryFor: seedFile). options selections: (self selectComponentsFor: seedFile). ^options
writeCurrentSeedOptions self canWriteOptions ifFalse: [^self]. self writeInstallDirectoryToOptions. self writeSelectionsToOptions
writeInstallDirectoryToOptions self currentSeedOptions installDirectory: self installDirectory value
writeSelectionsToOptions self currentSeedOptions selections: self components selections
</methods> <methods> VisualWorks.InstallerMainApplication class <category>utils</category>
varPathString | quoteString twoQuoteString | quoteString := String with: $'. twoQuoteString := String with: $' with: $'. ^Win95SystemSupport currentVersion printString copyReplaceAll: quoteString with: twoQuoteString
</methods> <methods> VisualWorks.InstallerMainApplication class <category>defaults</category>
applicationVersion ^self subclassShouldImplement: #applicationVersion
baseApplicationName ^self subclassShouldImplement: #baseApplicationName
classesToKeep "Don't strip these classes." ^(VisualWorks localBindings collect: [:binding | binding value]) select: [:class | class isBehavior]
companyName ^#Cincom << #installer >> 'Cincom'
installDirectory ^self subclassShouldImplement: #installDirectory
installDirectoryVariableName ^'VISUALWORKS'
methodAssociationsFor: aClass ^Array with: aClass -> aClass selectors with: aClass class -> aClass class selectors
methodsToKeep "Don't strip these methods." ^self classesToKeep inject: OrderedCollection new into: [:associations :class | associations addAll: (self methodAssociationsFor: class); yourself]
sourcePathVariableName ^'SOURCE_PATH'
</methods> <methods> VisualWorks.InstallerMainApplication class <category>gui testing</category>
dynamicReferencesTest ^self new dynamicReferencesTest
</methods> <methods> VisualWorks.InstallerMainApplication class <category>updating</category>
update: anAspectSymbol anAspectSymbol == #deployed ifTrue: [self open]
</methods> <methods> VisualWorks.InstallerMainApplication class <category>accessing</category>
currentVersionString ^'1.5'
debugging ^Debugging ifNil: [true] ifNotNil: [Debugging]
debugging: aBoolean Debugging := aBoolean
</methods> <methods> VisualWorks.InstallerMainApplication class <category>platform encoding - compat</category>
currentVmPlatDir "Answer the target installation directory of the default VirtualMachine for the currently running platform, peeling off the VM tail." | path | path := (self vmByPlatformId at: ObjectMemory platformByte) last. ^path copyFrom: 1 to: path size - 1
</methods> <methods> VisualWorks.InstallerMainApplication class <category>private</category>
subclassShouldImplement: aSymbol ^((#subclassShouldImplement << #installer >> '{Please implement <1s> in <2s>}') expandMacrosWith: aSymbol printString with: self class name)
</methods> <methods> VisualWorks.InstallerMainApplication class <category>platform encoding</category>
vmByPlatformId "self vmByPlatformId" ^VmByPlatformId ifNil: [VmByPlatformId := self vmByPlatformIdDictionary]
</methods> <methods> VisualWorks.InstallerMainApplication class <category>interface opening</category>
open ^[super open] on: Cancel , HeadlessError do: [:ex | ]
</methods> <methods> VisualWorks.InstallerMainApplication class <category>instance creation</category>
openInitializedFrom: anInstallerMainApplication | newInstance | newInstance := self basicNew. newInstance serverChecked value: anInstallerMainApplication serverChecked value. newInstance updateApplied: anInstallerMainApplication updateApplied. newInstance configuration: anInstallerMainApplication configuration. newInstance seedMaps addAll: anInstallerMainApplication seedMaps. newInstance seedMaps do: [:map | map removeDependent: anInstallerMainApplication. map addDependent: newInstance]. newInstance seedLogs addAll: anInstallerMainApplication seedLogs. newInstance seedMap value: anInstallerMainApplication seedMap value. newInstance seedLog value: anInstallerMainApplication seedLog value. newInstance initialize. ^self openOn: newInstance
</methods> <methods> VisualWorks.InstallerMainApplication class <category>class initialization</category>
vmByPlatformIdDictionary "Platform bytes are listed in ~/bin/src/doc/vm/hpsversion.text" ^(IdentityDictionary new) at: 21 put: #('VM AIX' #('bin' 'aix' 'visual')); at: 25 put: #('VM HPUX' #('bin' 'hpux11' 'visual')); at: 29 put: #('VM Solaris' #('bin' 'solaris' 'visual')); at: 32 put: #('VM Powermac' #('bin' 'powermac' 'visual')); at: 35 put: #('VM ADUX' #('bin' 'adux' 'visual')); at: 39 put: #('VM MacOSX' #('bin' 'macx' 'visual.app' 'Contents' 'MacOS' 'vwmacxgui')); at: 40 put: #('VM Linux x86' #('bin' 'linux86' 'visual')); at: 41 put: #('VM Windows' #('bin' 'win' 'vwnt.exe')); at: 42 put: #('VM Linux PPC' #('bin' 'linuxPPC' 'visual')); at: 43 put: #('VM Linux SPARC' #('bin' 'unsupported' 'linuxSPARC' 'visual')); at: 44 put: #('VM Linux 68K' #('bin' 'unsupported' 'linux68K' 'visual')); at: 45 put: #('VM Linux ARM' #('bin' 'unsupported' 'inuxARM' 'visual')); at: 46 put: #('VM MacOSX X11' #('bin' 'macxx11' 'visual.app' 'Contents' 'MacOS' 'vwmacxx11gui')); at: 48 put: #('VM WinCE ARM' #('bin' 'cearm' 'vwnt.exe')); at: 49 put: #('VM WinCE x86' #('bin' 'cex86' 'vwnt.exe')); at: 51 put: #('VM Solaris x86' #('bin' 'unsupported' 'solaris86' 'visual')); at: 52 put: #('VM MacOSX' #('bin' 'macx' 'visual.app' 'Contents' 'MacOS' 'vwmacxgui')); at: 53 put: #('VM MacOSX X11' #('bin' 'macxx11' 'visual.app' 'Contents' 'MacOS' 'vwmacxx11gui')); at: 62 put: #('VM SGI' #('bin' 'sgi' 'visual')); at: 64 put: #('VM Linux x86-64 64-bit' #('bin' 'preview' 'linuxx86_64' 'visual')); at: 65 put: #('VM Solaris 64-bit' #('bin' 'solaris64' 'visual')); at: 66 put: #('VM Solaris x86 64-bit' #('bin' 'unsupported' 'solarisx86_64' 'visual')); yourself
</methods> <methods> VisualWorks.InstallerMainApplication class <category>deployment</category>
dynamicallyReferencedClasses ^#()
dynamicallyReferencedSelectors ^#(#acceptButtonPressed #dynamicReferencesTest #fileSelectionSizePlugLabelPressed #fileSelectionTailPlugLabelPressed #fileSelectionTimestampPlugLabelPressed #goToDefaultFolder20x20 #goToDefaultFolder20x20mask #mac #plat #seedFile: #setInstallerHome: #tgtCmps #unix #win32)
</methods> <methods> VisualWorks.ThanksPage <category>private</category>
generateText ^(self parent forInstall ifTrue: [#thanksInstallTemplate << #installer >> 'Thank you for installing <1s>.<nn>To find the latest information about Cincom Smalltalk and links to Smalltalk developer resources please visit the Cincom Smalltalk Developer Pages at:<nnt>http://www.cincomsmalltalk.com'] ifFalse: [#thanksUninstallTemplate << #installer >> 'Thank you for using <1s>.<nn>To find the latest information about Cincom Smalltalk and links to Smalltalk developer resources please visit the Cincom Smalltalk Developer Pages at:<nnt>http://www.cincomsmalltalk.com']) expandMacrosWith: self parent seedFile printString
pageTitleText ^(self parent forInstall ifTrue: [#thanksPageTitleInstall << #installer >> '<bl>Installation Complete'] ifFalse: [#thanksPageTitleUninstall << #installer >> '<bl>Uninstall Complete']) expandMacros
visibleButtons ^#(#defaultButton)
</methods> <methods> VisualWorks.ThanksPage <category>interface opening</category>
defaultAction ^self parent quit
defaultButtonLabel ^(#Exit << #installer >> 'Exit') expandMacros
postOpenWith: aBuilder super postOpenWith: aBuilder. (self parent wrapperAt: #defaultButton) newBounds: (self parent wrapperAt: #cancel) bounds
</methods> <methods> VisualWorks.SeedSelectorPage <category>updating</category>
forkedUpdateSeedFileDisplay self parent doNowInUIProcess: [self updateSeedFileDisplay]
setLocationPrompt self parent undecided ifTrue: [^self setLocationValue: #noActionSelected << #installer >> 'No action selected.']. self setLocationPromptFor: self seedFile value
setLocationPromptFor: anObject anObject ifNil: [^self setLocationValue: self enterSeedPathText]. anObject errorEncountered ifTrue: [^self setLocationValue: (#seedFileReadError << #installer >> 'There was an error reading from:<nt><1s>' expandMacrosWith: anObject location asString)]. self setLocationValue: ((self parent forUninstall ifTrue: [#uninstallLocationPrompt << #installer >> 'Uninstall from:<nt><1s>'] ifFalse: [#installLocationPrompt << #installer >> 'Install from:<nt><1s>']) expandMacrosWith: (self parent displayStringForLocation: anObject location))
setLocationValue: aString self location value = aString ifFalse: [self location value: aString]
updateSeedFileDisplay | seedView | self builder ifNil: [^self]. (seedView := self widgetAt: #seedFile) isNil ifTrue: [^self]. seedView editor updateDisplayContents. self setLocationPrompt
</methods> <methods> VisualWorks.SeedSelectorPage <category>accessing</category>
parent: anObject super parent: anObject. anObject expressInterestIn: #seedStatus for: self sendBack: #forkedUpdateSeedFileDisplay. anObject seedLog onChangeSend: #updateSeedFileDisplay to: self. anObject seedMap onChangeSend: #updateSeedFileDisplay to: self
</methods> <methods> VisualWorks.SeedSelectorPage <category>private</category>
enterPathToUninstallLog | size | ^((size := self seedFiles value size) = 0 ifTrue: [#enterPathToUninstallLog << #installer >> 'Nothing detected to uninstall.%<nn>Click %<b>Other%<e> to specify an %<b>uninstal.log%<e> file in the installation root directory .%<1x>'] ifFalse: [#enterPathToOrSelectUninstallLog << #installer >> '<1p> versions detected to uninstall.%<nn>Select from drop-down list above, or click %<b>Other%<e> to manually specify an %<b>uninstal.log%<e> file in the installation root directory.%<1x>']) expandMacrosWith: size
enterSeedPathText ^(self parent forUninstall ifTrue: [self enterPathToUninstallLog] ifFalse: [#enterPathToInstallMap << #installer >> 'Nothing detected to install. Click <b>Other<e> to specify an <b>install.map<e> file in the install source directory.<1x>']) expandMacrosWith: (self parent serverChecked value ifTrue: [String new] ifFalse: [(#checkServerText << #installer >> ' Or, click <b>Back<e> to check Cincom''s web site for available versions to install.') expandMacros])
generateText ^(self parent forInstall ifTrue: [#SelectMapTextTemplate << #installer >> 'Please select the product you wish to install and click <b>Next<e>.'] ifFalse: [#SelectLogTextTemplate << #installer >> 'Please select the version you wish to remove and click <b>Next<e>.']) expandMacros
invalidSeedFileLocation: aString Dialog warn: (#invalidSeedFileLocation << #installer >> 'Error:<nt><1s><nn> is not a valid file.' expandMacrosWith: aString). ^nil
pageTitleText ^(self parent forInstall ifTrue: [#titleSeedSelectorPageInstall << #installer >> '<bl>Install Cincom Smalltalk'] ifFalse: [#titleSeedSelectorPageUninstall << #installer >> '<bl>Uninstall Cincom Smalltalk']) expandMacros
seedFromLocation: fileLocation | file seedClass | file := fileLocation. seedClass := self parent forInstall ifTrue: [InstallMap] ifFalse: [InstallLog]. [(file isURI not and: [file isDirectory]) ifTrue: [file := file constructSafe: seedClass defaultLocationTail]] on: RemoteExceptions do: [:ex | ]. ^seedClass on: file for: self parent
verifySeedLocation: aString ^ [self parent forInstall ifTrue: [aString asRemoteOrLocalFile] ifFalse: [aString asFilename]] on: Error do: [:ex | nil]
</methods> <methods> VisualWorks.SeedSelectorPage <category>displaying</category>
printSeedFile: anObject ^anObject displayStringForList: self seedFiles value
readSeedFileFromString: aString aString isEmpty ifTrue: [^nil]. ^self seedFiles value detect: [:srcFl | (srcFl displayStringForList: self seedFiles value) = aString string] ifNone: [Dialog warn: (#invalidSeedFileDisplayString << #installer >> 'Error:<nt><1s><nn> is not a valid choice.' expandMacrosWith: aString). nil]
</methods> <methods> VisualWorks.SeedSelectorPage <category>interface opening</category>
postBuildWith: aBuilder super postBuildWith: aBuilder. self pageTitle value: self pageTitleText. (self widgetAt: #location) ifNotNil: [:editor | editor controller: Controller new]. (self widgetAt: #seedFile) when: #listClosed send: #setLocationPrompt to: self; ifNotNil: [:view | view editor controller menuHolder value: nil]. self updateSeedFileDisplay
</methods> <methods> VisualWorks.SeedSelectorPage <category>synchronization</category>
okToBuild ^self parent isExpressInstall not or: [self parent seedFile ifNil: [true] ifNotNil: [:aSeedFile | aSeedFile waitForUpdates; errorEncountered]]
okToProceed | result | self parent seedFile ifNil: [^self parent noSeedSelectedDialog]. result := Cursor wait showWhile: [self parent seedFile errorEncountered ifTrue: [self parent seedFile forkEnsureFileScan]. self parent validSeedFile]. self parent processOutstandingEvents. self parent refreshScreenList. ^result
</methods> <methods> VisualWorks.SeedSelectorPage <category>aspects</category>
location ^location ifNil: [location := String new asValue]
seedFile ^seedFile ifNil: [seedFile := ((AspectAdaptor subject: self parent) forAspect: #seedFile) onChangeSend: #updateSeedFileDisplay to: self; onChangeSend: #updateDefaultButtonLabel to: self; yourself]
seedFiles ^seedFiles ifNil: [seedFiles := (AspectAdaptor subject: self parent) forAspect: #seedFiles]
</methods> <methods> VisualWorks.SeedSelectorPage <category>dialogs</category>
findInstallLogDialog: initialAnswer ^SeedFileDialog request: (#promptInstallLogLocation << #installer >> 'Enter the location of the uninstal.log file:') asString initialAnswer: initialAnswer pattern: (#InstallLogFilePatternLabel << #dialogs >> 'Uninstall Seed Files (*.log)') asString -> '*.log'
findInstallMapDialog: initialAnswer ^SeedFileDialog request: (#promptInstallMapLocation << #installer >> 'Enter the location of the install.map file:') asString initialAnswer: initialAnswer pattern: (#InstallMapFilePatternLabel << #dialogs >> 'Install Seed Files (*.map)') asString -> '*.map'
findSeedDialog | initialAnswer | initialAnswer := self seedFile value ifNil: [String new] ifNotNil: [:srcFl | srcFl location asString]. ^self parent forUninstall ifTrue: [self findInstallLogDialog: initialAnswer] ifFalse: [self findInstallMapDialog: initialAnswer]
</methods> <methods> VisualWorks.SeedSelectorPage <category>actions</category>
getOtherSeedLocation | answer newLocation newSeed | answer := self findSeedDialog. answer isEmpty ifTrue: [^self]. newLocation := (self verifySeedLocation: answer) ifNil: [^self invalidSeedFileLocation: answer]. newSeed := self seedFromLocation: newLocation. newSeed forInstall ifTrue: [newSeed forkEnsureFileScan]. newSeed errorEncountered ifTrue: [^self invalidSeedFileLocation: newLocation asString]. self seedFile value: newSeed
</methods> <methods> VisualWorks.ActionSelectorPage <category>dialogs</category>
warnSelectInstallActionDialog Dialog warn: #warnSelectInstallActionDialog << #installer >> 'Please select Install or Uninstall.'
</methods> <methods> VisualWorks.ActionSelectorPage <category>synchronization</category>
okToProceed self parent undecided ifTrue: [self warnSelectInstallActionDialog. ^false]. self parent refreshScreenList. ^true
</methods> <methods> VisualWorks.ActionSelectorPage <category>interface opening</category>
postBuildWith: aBuilder super postBuildWith: aBuilder. (self widgetAt: #uninstallText) ifNotNil: [:editor | editor controller: Controller new]. self changedInstallAction
</methods> <methods> VisualWorks.ActionSelectorPage <category>updating</category>
changedInstallAction self installAction value ifNil: [self parent installAction value ifNotNil: [self parent installAction value: nil]] ifNotNil: [:symbol | self perform: symbol]
custom self parent expressInstall value: false. self parent installAction value = #Install ifFalse: [self parent installAction value: #Install]
express self parent expressInstall value: true. self parent installAction value = #Install ifFalse: [self parent installAction value: #Install]
parentChangedInstallAction | newValue | self parent installAction value ifNil: [^self installAction value: nil]. self parent installAction value = #Uninstall ifTrue: [^self installAction value: #uninstall]. self parent installAction value = #Install ifFalse: [^self installAction value: nil]. newValue := self parent expressInstall value ifTrue: [#express] ifFalse: [#custom]. newValue = self installAction value ifFalse: [self installAction value: newValue]
uninstall self parent installAction value = #Uninstall ifFalse: [self parent installAction value: #Uninstall]
</methods> <methods> VisualWorks.ActionSelectorPage <category>accessing</category>
parent: anObject super parent: anObject. anObject installAction onChangeSend: #parentChangedInstallAction to: self. anObject expressInstall onChangeSend: #parentChangedInstallAction to: self
</methods> <methods> VisualWorks.ActionSelectorPage <category>private</category>
generateText ^(#ActionSelectorInstructions << #installer >> 'This tool can either install or remove Cincom Smalltalk from your computer. Cincom Smalltalk can be installed either from local media, such as a CDROM drive, or from Cincom''s server. Select an option and click <b>Next<e>.') expandMacros
pageTitleText ^#titleActionSelectorPage << #installer >> '<bl>Welcome to the <1s>' expandMacrosWith: self parent installerName
</methods> <methods> VisualWorks.ActionSelectorPage <category>aspects</category>
customText ^customText ifNil: [customText := (#ActionSelectorCustomText << #installer >> 'Choose which version and components of Cincom Smalltalk to install. All installation options may be customized.') asString asValue]
installAction ^installAction ifNil: [installAction := (#express asValue) onChangeSend: #changedInstallAction to: self; yourself]
typicalText ^typicalText ifNil: [typicalText := (self parent commandLineSeedMap ifNil: [#ActionSelectorTypicalTextRemote << #installer >> 'Express install of the latest version of Cincom Smalltalk from Cincom''s FTP server using typical install options.'] ifNotNil: [:cmdMap | #ActionSelectorTypicalTextLocal << #installer >> 'Express install of Cincom Smalltalk using typical install options.']) asString asValue]
uninstallText ^uninstallText ifNil: [uninstallText := (#ActionSelectorUninstallText << #installer >> 'Remove an existing installation of Cincom Smalltalk from this computer.') asString asValue]
</methods> <methods> VisualWorks.AbstractWizardPage class <category>interface specs</category>
subcanvasSpec "Tools.UIPainter new openOnClass: self andSelector: #subcanvasSpec" <resource: #canvas> ^#(#{UI.FullSpec} #window: #(#{UI.WindowSpec} #label: #(#{Kernel.UserMessage} #key: #ThanksPage #defaultString: 'ThanksPage' #catalogID: #installer ) #bounds: #(#{Graphics.Rectangle} 1033 380 1653 690 ) #isEventDriven: true ) #component: #(#{UI.SpecCollection} #collection: #( #(#{UI.InputFieldSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 0 0 0 1 25 0 ) #name: #pageTitle #flags: 0 #model: #pageTitle #tabable: false #isReadOnly: true #type: #text ) #(#{UI.TextEditorSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 30 0 0 1 0 1 ) #name: #text #flags: 4 #model: #text #tabable: false #style: #system #isReadOnly: true #tabRequiresControl: false ) ) ) )
</methods> <methods> VisualWorks.LicenseVerifierPage class <category>interface specs</category>
subcanvasSpec "Tools.UIPainter new openOnClass: self andSelector: #subcanvasSpec" <resource: #canvas> ^#(#{UI.FullSpec} #window: #(#{UI.WindowSpec} #label: #(#{Kernel.UserMessage} #key: #LicenseVerifierPage #defaultString: 'LicenseVerifierPage' #catalogID: #installer ) #bounds: #(#{Graphics.Rectangle} 1257 384 1877 694 ) #isEventDriven: true ) #component: #(#{UI.SpecCollection} #collection: #( #(#{UI.InputFieldSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 0 0 0 1 25 0 ) #name: #pageTitle #flags: 0 #model: #pageTitle #tabable: false #isReadOnly: true #type: #text ) #(#{UI.TextEditorSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 40 0 0 1 -60 1 ) #name: #text #model: #text #tabable: false #style: #system #isReadOnly: true #tabRequiresControl: false ) #(#{UI.RadioButtonSpec} #layout: #(#{UI.AlignmentOrigin} 0 0 -30 1 0 1 ) #name: #accept #model: #accepted #label: #(#{Kernel.UserMessage} #key: #iAcceptLabel #defaultString: 'I Accept' #catalogID: #installer ) #select: true ) #(#{UI.RadioButtonSpec} #layout: #(#{UI.AlignmentOrigin} 0 0 0 1 0 1 ) #name: #doNotAccept #model: #accepted #label: #(#{Kernel.UserMessage} #key: #iDoNotAccept #defaultString: 'I Do Not Accept' #catalogID: #installer ) #select: false ) #(#{UI.ActionButtonSpec} #layout: #(#{Graphics.LayoutFrame} -100 1 -25 1 0 1 0 1 ) #name: #copyText #model: #copyText #helpText: #(#{Kernel.UserMessage} #key: #CopyTextHelp #defaultString: 'Copy license text to clipboard.' #catalogID: #installer ) #label: #(#{Kernel.UserMessage} #key: #CopyText #defaultString: 'Copy Text' #catalogID: #installer ) #defaultable: true ) ) ) )
</methods> <methods> VisualWorks.ComponentSelectorPage class <category>resources</category>
selectMenuInstall "Tools.MenuEditor new openOnClass: self andSelector: #selectMenuInstall" <resource: #menu> ^#(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #typicallyInstalledComponentsLabel #defaultString: 'Typically Installed Components' #catalogID: #installer ) #nameKey: #selectDefaultComponents #value: #selectDefaultComponents ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #allLabel #defaultString: 'All' #catalogID: #installer ) #nameKey: #selectAllComponents #value: #selectAllComponents ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #noneLabel #defaultString: 'None' #catalogID: #installer ) #nameKey: #selectNoComponents #value: #selectNoComponents ) ) #(1 2 ) nil ) decodeAsLiteralArray
selectMenuUninstall "Tools.MenuEditor new openOnClass: self andSelector: #selectMenuUninstall" <resource: #menu> ^#(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #allLabel #defaultString: 'All' #catalogID: #installer ) #nameKey: #selectAllComponents #value: #selectAllComponents ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #noneLabel #defaultString: 'None' #catalogID: #installer ) #nameKey: #selectNoComponents #value: #selectNoComponents ) ) #(2 ) nil ) decodeAsLiteralArray
</methods> <methods> VisualWorks.ComponentSelectorPage class <category>interface specs</category>
subcanvasSpec "Tools.UIPainter new openOnClass: self andSelector: #subcanvasSpec" <resource: #canvas> ^#(#{UI.FullSpec} #window: #(#{UI.WindowSpec} #label: #(#{Kernel.UserMessage} #key: #ComponentSelectorPage #defaultString: 'ComponentSelectorPage' #catalogID: #installer ) #bounds: #(#{Graphics.Rectangle} 1197 489 1817 799 ) #isEventDriven: true ) #component: #(#{UI.SpecCollection} #collection: #( #(#{UI.InputFieldSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 0 0 -200 1 25 0 ) #name: #pageTitle #flags: 0 #model: #pageTitle #tabable: false #isReadOnly: true #type: #text ) #(#{UI.MenuButtonSpec} #layout: #(#{Graphics.LayoutFrame} -185 1 4 0 0 1 25 0 ) #name: #selectMenuButton #model: #selectMenuChannel #label: #(#{Kernel.UserMessage} #key: #selectColonLabel #defaultString: 'Select:' #catalogID: #installer ) #menu: #selectMenu ) #(#{UI.SequenceViewSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 30 0 0 1 -30 0.666666 ) #name: #components #flags: 15 #model: #components #helpText: '' #multipleSelections: true #style: #system #selectionType: #checkMark ) #(#{UI.InputFieldSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 -25 0.666666 0 1 0 0.666666 ) #name: #componentName #flags: 0 #model: #componentName #tabable: false #isReadOnly: true ) #(#{UI.TextEditorSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 0 0.666666 0 1 -30 1 ) #name: #description #flags: 5 #model: #description #tabable: false #style: #system #isReadOnly: true #tabRequiresControl: false ) #(#{UI.CheckBoxSpec} #layout: #(#{UI.AlignmentOrigin} 0 0 0 1 0 1 ) #name: #desktopShortcut #model: #desktopShortcut #label: #(#{Kernel.UserMessage} #key: #placeShortcutOnDesktopLabel #defaultString: 'Place shortcut on desktop' #catalogID: #installer ) ) #(#{UI.InputFieldSpec} #layout: #(#{Graphics.LayoutFrame} 300 0 -25 1 0 1 0 1 ) #name: #spaceRequired #flags: 0 #model: #spaceRequired #alignment: #right #isReadOnly: true #type: #number ) ) ) )
</methods> <methods> VisualWorks.UninstallerPage class <category>interface specs</category>
subcanvasSpec "Tools.UIPainter new openOnClass: self andSelector: #subcanvasSpec" <resource: #canvas> ^#(#{UI.FullSpec} #window: #(#{UI.WindowSpec} #label: #(#{Kernel.UserMessage} #key: #UninstallerPage #defaultString: 'UninstallerPage' #catalogID: #installer ) #bounds: #(#{Graphics.Rectangle} 1242 361 1862 671 ) #isEventDriven: true ) #component: #(#{UI.SpecCollection} #collection: #( #(#{UI.InputFieldSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 0 0 -200 1 25 0 ) #name: #pageTitle #flags: 0 #model: #pageTitle #tabable: false #isReadOnly: true #type: #text ) #(#{UI.TextEditorSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 40 0 0 1 -110 1 ) #name: #text #flags: 4 #model: #text #tabable: false #style: #system #isReadOnly: true #tabRequiresControl: false ) #(#{UI.LabelSpec} #layout: #(#{UI.AlignmentOrigin} 0 0 -80 1 0 1 ) #name: #componentLabel #label: #(#{Kernel.UserMessage} #key: #componentLabel #defaultString: 'Component:' #catalogID: #installer ) ) #(#{UI.InputFieldSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 -80 1 0 1 -55 1 ) #name: #componentName #flags: 0 #model: #component #tabable: false #isReadOnly: true ) #(#{UI.LabelSpec} #layout: #(#{UI.AlignmentOrigin} 0 0 -25 1 0 1 ) #name: #totalProgressLabel #label: #(#{Kernel.UserMessage} #key: #totalProgressLabel #defaultString: 'Total Progress:' #catalogID: #installer ) ) #(#{UI.ProgressWidgetSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 -25 1 0 1 0 1 ) #name: #totalProgress #isOpaque: true #colors: #(#{UI.LookPreferences} #setForegroundColor: #(#{Graphics.ColorValue} 128 2624 4288 ) #setBackgroundColor: #(#{Graphics.ColorValue} #white ) ) #model: #totalProgress #direction: #horizontal #position: #topLeft #area: true #reverse: false ) ) ) )
</methods> <methods> VisualWorks.SummaryPage class <category>interface specs</category>
subcanvasSpec "Tools.UIPainter new openOnClass: self andSelector: #subcanvasSpec" <resource: #canvas> ^#(#{UI.FullSpec} #window: #(#{UI.WindowSpec} #label: #(#{Kernel.UserMessage} #key: #SummaryPage #defaultString: 'SummaryPage' #catalogID: #installer ) #bounds: #(#{Graphics.Rectangle} 612 355 1232 665 ) #isEventDriven: true ) #component: #(#{UI.SpecCollection} #collection: #( #(#{UI.InputFieldSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 0 0 -75 1 25 0 ) #name: #pageTitle #flags: 0 #model: #pageTitle #tabable: false #isReadOnly: true #type: #text ) #(#{UI.ActionButtonSpec} #layout: #(#{Graphics.LayoutFrame} -75 1 0 0 0 1 25 0 ) #name: #saveOptions #model: #saveOptions #helpText: #(#{Kernel.UserMessage} #key: #SaveSelectionsForLaterUse #defaultString: 'Save selections for later use' #catalogID: #installer ) #label: #(#{Kernel.UserMessage} #key: #Save #defaultString: 'Save' #catalogID: #installer ) #defaultable: true ) #(#{UI.TextEditorSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 30 0 0 1 0 1 ) #name: #text #flags: 5 #model: #text #tabable: false #style: #system #isReadOnly: true #tabRequiresControl: false ) ) ) )
</methods> <methods> Tools.RemoveModifiedFileDialog class <category>interface specs</category>
windowSpec "Tools.UIPainter new openOnClass: self andSelector: #windowSpec" <resource: #canvas> ^#(#{UI.FullSpec} #window: #(#{UI.WindowSpec} #label: #(#{Kernel.UserMessage} #key: #fileHasBeenModified #defaultString: 'File has been modified...' #catalogID: #installer ) #min: #(#{Core.Point} 512 150 ) #max: #(#{Core.Point} 0 0 ) #bounds: #(#{Graphics.Rectangle} 960 600 1472 750 ) ) #component: #(#{UI.SpecCollection} #collection: #( #(#{UI.TextEditorSpec} #layout: #(#{Graphics.LayoutFrame} 10 0 10 0 -10 1 -80 1 ) #name: #message #flags: 4 #model: #message #tabable: false #style: #system #isReadOnly: true #tabRequiresControl: false ) #(#{UI.ActionButtonSpec} #layout: #(#{Graphics.LayoutFrame} -55 0.333333 -70 1 55 0.333333 -45 1 ) #name: #remove #model: #remove #helpText: #(#{Kernel.UserMessage} #key: #overwriteHelp #defaultString: 'Overwrite the existing file.' #catalogID: #dialogs ) #label: #(#{Kernel.UserMessage} #key: #removeLabel #defaultString: 'Remove' #catalogID: #installer ) #defaultable: true ) #(#{UI.ActionButtonSpec} #layout: #(#{Graphics.LayoutFrame} -55 0.666666 -70 1 55 0.666666 -45 1 ) #name: #skip #model: #skip #helpText: #(#{Kernel.UserMessage} #key: #skipFileHelp #defaultString: 'Do not overwrite the existing file.' #catalogID: #dialogs ) #label: #(#{Kernel.UserMessage} #key: #skipLabel #defaultString: 'Skip' #catalogID: #installer ) #defaultable: true ) #(#{UI.CheckBoxSpec} #layout: #(#{UI.AlignmentOrigin} 10 0 -10 1 0 1 ) #name: #applyToAll #model: #applyToAll #helpText: #(#{Kernel.UserMessage} #key: #rememberAnswerHelp #defaultString: 'Remember this answer and do not ask again.' #catalogID: #dialogs ) #label: #(#{Kernel.UserMessage} #key: #useForAllLabel #defaultString: 'Use this answer for all modified files' #catalogID: #installer ) ) #(#{UI.ActionButtonSpec} #layout: #(#{Graphics.LayoutFrame} -120 1 -35 1 -10 1 -10 1 ) #name: #cancel #model: #cancel #helpText: #(#{Kernel.UserMessage} #key: #abortCurrentOperationHelp #defaultString: 'Abort the current operation.' #catalogID: #dialogs ) #label: #(#{Kernel.UserMessage} #key: #cancelLabel #defaultString: 'Cancel' #catalogID: #installer ) #defaultable: true ) ) ) )
</methods> <methods> VisualWorks.SeedFileDialog class <category>interface specs</category>
windowSpec "Tools.UIPainter new openOnClass: self andSelector: #windowSpec" <resource: #canvas> ^#(#{UI.FullSpec} #window: #(#{UI.WindowSpec} #label: #(#{Kernel.UserMessage} #key: #SelectSeedFile #defaultString: 'Select Seed File' #catalogID: #installer ) #min: #(#{Core.Point} 512 130 ) #max: #(#{Core.Point} 512 130 ) #bounds: #(#{Graphics.Rectangle} 2370 422 2882 552 ) ) #component: #(#{UI.SpecCollection} #collection: #( #(#{UI.InputFieldSpec} #layout: #(#{Graphics.LayoutFrame} 20 0 -110 1 -67 1 -90 1 ) #name: #prompt #flags: 0 #model: #prompt #tabable: false #isReadOnly: true ) #(#{UI.InputFieldSpec} #layout: #(#{Graphics.LayoutFrame} 20 0 -90 1 -67 1 -65 1 ) #name: #newSeedString #model: #newSeedString ) #(#{UI.LabelSpec} #layout: #(#{UI.AlignmentOrigin} -33 1 -90 1 0.5 1 ) #name: #browseLabel #label: #(#{Kernel.UserMessage} #key: #BrowseColon #defaultString: 'Browse:' #catalogID: #installer ) ) #(#{UI.ActionButtonSpec} #properties: #(#{UI.PropertyListDictionary} #labelFromApplication true ) #layout: #(#{Graphics.LayoutFrame} -47 1 -90 1 -20 1 -65 1 ) #name: #browseForSeed #model: #browseForSeed #label: #browseForSeedIcon #hasCharacterOrientedLabel: false #defaultable: true ) #(#{UI.ActionButtonSpec} #layout: #(#{Graphics.LayoutFrame} -80 0.5 -45 1 -10 0.5 -20 1 ) #name: #OK #model: #accept #label: #(#{Kernel.UserMessage} #key: #OK #defaultString: 'OK' #catalogID: #installer ) #isDefault: true #defaultable: true ) #(#{UI.ActionButtonSpec} #layout: #(#{Graphics.LayoutFrame} 10 0.5 -45 1 80 0.5 -20 1 ) #name: #cancel #model: #cancel #label: #(#{Kernel.UserMessage} #key: #Cancel #defaultString: 'Cancel' #catalogID: #installer ) #defaultable: true ) ) ) )
</methods> <methods> VisualWorks.InstallerPage class <category>interface specs</category>
subcanvasSpec "Tools.UIPainter new openOnClass: self andSelector: #subcanvasSpec" <resource: #canvas> ^#(#{UI.FullSpec} #window: #(#{UI.WindowSpec} #label: #(#{Kernel.UserMessage} #key: #InstallerPage #defaultString: 'InstallerPage' #catalogID: #installer ) #bounds: #(#{Graphics.Rectangle} 1239 445 1859 755 ) #isEventDriven: true ) #component: #(#{UI.SpecCollection} #collection: #( #(#{UI.InputFieldSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 0 0 -200 1 25 0 ) #name: #pageTitle #flags: 0 #model: #pageTitle #tabable: false #isReadOnly: true #type: #text ) #(#{UI.TextEditorSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 40 0 0 1 -140 1 ) #name: #text #flags: 4 #model: #text #tabable: false #style: #system #isReadOnly: true #tabRequiresControl: false ) #(#{UI.InputFieldSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 -135 1 0 1 -110 1 ) #name: #targetFile #flags: 0 #model: #targetFile #tabable: false #isReadOnly: true ) #(#{UI.ProgressWidgetSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 -110 1 0 1 -85 1 ) #name: #componentProgress #isOpaque: true #colors: #(#{UI.LookPreferences} #setForegroundColor: #(#{Graphics.ColorValue} 128 2624 4288 ) #setBackgroundColor: #(#{Graphics.ColorValue} #white ) ) #model: #componentProgress #direction: #horizontal #position: #topLeft #area: true #reverse: false ) #(#{UI.LabelSpec} #layout: #(#{UI.AlignmentOrigin} 0 0 -50 1 0 1 ) #name: #overallProgressLabel #label: #(#{Kernel.UserMessage} #key: #overallProgressLabel #defaultString: 'Overall Progress:' #catalogID: #installer ) ) #(#{UI.ProgressWidgetSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 -50 1 0 1 -25 1 ) #name: #totalProgress #isOpaque: true #colors: #(#{UI.LookPreferences} #setForegroundColor: #(#{Graphics.ColorValue} 128 2624 4288 ) #setBackgroundColor: #(#{Graphics.ColorValue} #white ) ) #model: #totalProgress #direction: #horizontal #position: #topLeft #area: true #reverse: false ) #(#{UI.InputFieldSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 -25 1 0 1 0 1 ) #name: #status #flags: 0 #model: #status #tabable: false #isReadOnly: true ) ) ) )
</methods> <methods> VisualWorks.ChooseDirectoryPage class <category>interface specs</category>
subcanvasSpec "Tools.UIPainter new openOnClass: self andSelector: #subcanvasSpec" <resource: #canvas> ^#(#{UI.FullSpec} #window: #(#{UI.WindowSpec} #label: #(#{Kernel.UserMessage} #key: #ChooseDirectoryPage #defaultString: 'ChooseDirectoryPage' #catalogID: #installer ) #bounds: #(#{Graphics.Rectangle} 649 271 1269 581 ) #isEventDriven: true ) #component: #(#{UI.SpecCollection} #collection: #( #(#{UI.InputFieldSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 0 0 0 1 25 0 ) #name: #pageTitle #flags: 0 #model: #pageTitle #tabable: false #isReadOnly: true #type: #text ) #(#{UI.TextEditorSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 40 0 0 1 -65 1 ) #name: #text #flags: 4 #model: #text #tabable: false #style: #system #isReadOnly: true #tabRequiresControl: false ) #(#{UI.LabelSpec} #layout: #(#{UI.AlignmentOrigin} 0 0 -25 1 0 1 ) #name: #installationDirectoryLabel #label: #(#{Kernel.UserMessage} #key: #installationDirectoryLabel #defaultString: 'Installation Directory:' #catalogID: #installer ) ) #(#{UI.InputFieldSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 -25 1 -85 1 0 1 ) #name: #installDirectory #model: #installDirectory ) #(#{UI.LabelSpec} #layout: #(#{UI.AlignmentOrigin} -75 1 -25 1 0 1 ) #name: #browseLabel #label: #(#{Kernel.UserMessage} #key: #BrowseColon #defaultString: 'Browse:' #catalogID: #installer ) ) #(#{UI.ActionButtonSpec} #properties: #(#{UI.PropertyListDictionary} #labelFromApplication true ) #layout: #(#{Graphics.LayoutFrame} -75 1 -25 1 -50 1 0 1 ) #name: #browseInstallationDirectory #model: #browseInstallationDirectory #label: #browseInstallationDirectoryIcon #hasCharacterOrientedLabel: false #defaultable: true ) ) ) )
</methods> <methods> VisualWorks.CheckServerPage class <category>interface specs</category>
subcanvasSpec "Tools.UIPainter new openOnClass: self andSelector: #subcanvasSpec" <resource: #canvas> ^#(#{UI.FullSpec} #window: #(#{UI.WindowSpec} #label: #(#{Kernel.UserMessage} #key: #CheckServerPage #defaultString: 'CheckServerPage' #catalogID: #installer ) #bounds: #(#{Graphics.Rectangle} 936 395 1556 705 ) #isEventDriven: true ) #component: #(#{UI.SpecCollection} #collection: #( #(#{UI.InputFieldSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 0 0 0 1 25 0 ) #name: #pageTitle #flags: 0 #model: #pageTitle #tabable: false #isReadOnly: true #type: #text ) #(#{UI.TextEditorSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 30 0 0 1 -40 1 ) #name: #text #flags: 5 #model: #text #tabable: false #style: #system #isReadOnly: true #tabRequiresControl: false ) #(#{UI.ActionButtonSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 -30 1 120 0 0 1 ) #name: #checkServer #model: #checkServer #label: #(#{Kernel.UserMessage} #key: #checkServer #defaultString: 'Check Server' #catalogID: #installer ) #defaultable: true ) #(#{UI.ActionButtonSpec} #layout: #(#{Graphics.LayoutFrame} 130 0 -30 1 250 0 0 1 ) #name: #cancelScan #flags: 40 #model: #cancelScan #label: #(#{Kernel.UserMessage} #key: #Stop #defaultString: 'Stop' #catalogID: #installer ) #defaultable: true ) #(#{UI.ActionButtonSpec} #layout: #(#{Graphics.LayoutFrame} 260 0 -30 1 380 0 0 1 ) #name: #applyUpdate #flags: 40 #model: #applyUpdate #label: #(#{Kernel.UserMessage} #key: #applyUpdate #defaultString: 'Apply Update' #catalogID: #installer ) #defaultable: true ) #(#{UI.InputFieldSpec} #layout: #(#{Graphics.LayoutFrame} 390 0 -30 1 0 1 0 1 ) #name: #versionString #flags: 0 #model: #versionString #tabable: false #alignment: #right #isReadOnly: true ) ) ) )
</methods> <methods> Tools.UnwritableCommonShortcutDialog class <category>interface specs</category>
windowSpec "Tools.UIPainter new openOnClass: self andSelector: #windowSpec" <resource: #canvas> ^#(#{UI.FullSpec} #window: #(#{UI.WindowSpec} #label: #(#{Kernel.UserMessage} #key: #cannotWriteShortcutTitle #defaultString: 'Cannot Write Shortcut...' #catalogID: #installer ) #min: #(#{Core.Point} 512 180 ) #bounds: #(#{Graphics.Rectangle} 1245 281 1757 461 ) ) #component: #(#{UI.SpecCollection} #collection: #( #(#{UI.TextEditorSpec} #layout: #(#{Graphics.LayoutFrame} 10 0 10 0 -10 1 -80 1 ) #name: #message #flags: 4 #model: #message #tabable: false #style: #system #isReadOnly: true #tabRequiresControl: false ) #(#{UI.ActionButtonSpec} #layout: #(#{Graphics.LayoutFrame} -55 0.333333 -70 1 55 0.333333 -45 1 ) #name: #personalize #model: #personalize #helpText: #(#{Kernel.UserMessage} #key: #personalizeHelp #defaultString: 'Try the current users profile instead of the shared area.' #catalogID: #installer ) #label: #(#{Kernel.UserMessage} #key: #personalizeLabel #defaultString: 'Personalize' #catalogID: #installer ) #defaultable: true ) #(#{UI.ActionButtonSpec} #layout: #(#{Graphics.LayoutFrame} -55 0.666666 -70 1 55 0.666666 -45 1 ) #name: #skip #model: #skip #helpText: #(#{Kernel.UserMessage} #key: #skipShortcutHelp #defaultString: 'Do not create this shortcut.' #catalogID: #installer ) #label: #(#{Kernel.UserMessage} #key: #skipLabel #defaultString: 'Skip' #catalogID: #installer ) #defaultable: true ) #(#{UI.CheckBoxSpec} #layout: #(#{UI.AlignmentOrigin} 10 0 -10 1 0 1 ) #name: #applyToAll #model: #applyToAll #helpText: #(#{Kernel.UserMessage} #key: #rememberAnswerHelp #defaultString: 'Remember this answer and do not ask again.' #catalogID: #dialogs ) #label: #(#{Kernel.UserMessage} #key: #useForAllCommonShortcutsLabel #defaultString: 'Use this answer for all common shortcuts' #catalogID: #installer ) ) #(#{UI.ActionButtonSpec} #layout: #(#{Graphics.LayoutFrame} -120 1 -35 1 -10 1 -10 1 ) #name: #cancel #model: #cancel #helpText: #(#{Kernel.UserMessage} #key: #abortInstallationHelp #defaultString: 'Abort the entire installation.' #catalogID: #installer ) #label: #(#{Kernel.UserMessage} #key: #cancelLabel #defaultString: 'Cancel' #catalogID: #installer ) #defaultable: true ) ) ) )
</methods> <methods> Tools.RemoveNonEmptyDirectoryDialog class <category>interface specs</category>
windowSpec "Tools.UIPainter new openOnClass: self andSelector: #windowSpec" <resource: #canvas> ^#(#{UI.FullSpec} #window: #(#{UI.WindowSpec} #label: #(#{Kernel.UserMessage} #key: #directoryIsNotEmpty #defaultString: 'Directory is not empty...' #catalogID: #installer ) #min: #(#{Core.Point} 512 150 ) #bounds: #(#{Graphics.Rectangle} 0 0 512 150 ) ) #component: #(#{UI.SpecCollection} #collection: #( #(#{UI.TextEditorSpec} #layout: #(#{Graphics.LayoutFrame} 10 0 10 0 -10 1 -80 1 ) #name: #message #flags: 4 #model: #message #tabable: false #style: #system #isReadOnly: true #tabRequiresControl: false ) #(#{UI.ActionButtonSpec} #layout: #(#{Graphics.LayoutFrame} -55 0.333333 -70 1 55 0.333333 -45 1 ) #name: #remove #model: #remove #helpText: #(#{Kernel.UserMessage} #key: #removeDirectoryHelp #defaultString: 'Remove this directory and all its contents.' #catalogID: #dialogs ) #label: #(#{Kernel.UserMessage} #key: #removeLabel #defaultString: 'Remove' #catalogID: #installer ) #defaultable: true ) #(#{UI.ActionButtonSpec} #layout: #(#{Graphics.LayoutFrame} -55 0.666666 -70 1 55 0.666666 -45 1 ) #name: #skip #model: #skip #helpText: #(#{Kernel.UserMessage} #key: #skipDirectoryHelp #defaultString: 'Do not remove this directory.' #catalogID: #dialogs ) #label: #(#{Kernel.UserMessage} #key: #skipLabel #defaultString: 'Skip' #catalogID: #installer ) #defaultable: true ) #(#{UI.CheckBoxSpec} #layout: #(#{UI.AlignmentOrigin} 10 0 -10 1 0 1 ) #name: #applyToAll #model: #applyToAll #helpText: #(#{Kernel.UserMessage} #key: #rememberAnswerHelp #defaultString: 'Remember this answer and do not ask again.' #catalogID: #dialogs ) #label: #(#{Kernel.UserMessage} #key: #useForAllNonEmptyDirectoriesLabel #defaultString: 'Use this answer for all non-empty directories' #catalogID: #installer ) ) #(#{UI.ActionButtonSpec} #layout: #(#{Graphics.LayoutFrame} -120 1 -35 1 -10 1 -10 1 ) #name: #cancel #model: #cancel #helpText: #(#{Kernel.UserMessage} #key: #abortCurrentOperationHelp #defaultString: 'Abort the current operation.' #catalogID: #dialogs ) #label: #(#{Kernel.UserMessage} #key: #cancelLabel #defaultString: 'Cancel' #catalogID: #installer ) #defaultable: true ) ) ) )
</methods> <methods> VisualWorks.InstallerMainApplication class <category>resources</category>
defaultBanner "UIMaskEditor new openOnClass: self andSelector: #defaultBanner" <resource: #image> ^CachedImage on: (Image extent: 1024@70 depth: 8 bitsPerPixel: 8 palette: (Graphics.MappedPalette withColors: (#(#(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4754 5364 5364)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5557 6328 6296)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6456 6649 5750)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5846 6521 6489)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7838 7870 7870)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8030 8127 8095)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8063 8095 8095)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8191 8191 7870)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7709 2923 2859)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5396 5396 5396)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4915 3887 7388)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5846 5846 5846)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5653 6360 6199)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6167 5782 5589)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6167 6360 6360)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6232 6681 6649)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6810 7067 7035)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7067 7259 7259)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6906 7356 7324)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7227 7516 7516)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7516 7709 7709)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7452 7741 7741)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7870 7870 7870)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7741 7966 7902)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7452 7773 7709)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8030 8127 8127)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8063 8127 8095)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8095 8095 8095)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4272 4979 4947)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5525 6039 6007)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5589 6328 6328)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5782 6489 5975)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6360 6970 6938)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6681 7131 7131)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7003 7324 7292)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7581 7709 7677)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7773 7934 7934)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7838 7902 7902)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7998 8159 8159)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8095 8127 8095)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8063 8127 8127)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4722 4754 4754)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7324 4722 2859)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4915 5332 5332)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5300 5814 5814)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5589 6360 6328)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5621 6392 6264)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8063 6906 3309)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7227 7549 7549)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7516 7741 7741)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7452 7773 7773)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8159 8191 7998)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8095 8127 8127)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4561 5204 5172)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4947 5686 5653)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5461 5750 5750)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5396 6135 6103)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6103 6103 6103)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5846 6232 6232)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5878 6553 6553)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7741 7613 3630)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7838 7838 3309)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6585 6874 6874)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6489 6938 6906)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8127 7452 2730)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7484 7773 7773)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7773 7966 7966)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7902 7902 7902)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8159 8191 7356)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8127 8127 8127)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8095 8159 8127)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8063 8159 8159)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5107 5621 5589)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8095 6938 2634)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5942 6553 6521)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6199 6746 6746)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8159 8191 4015)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6810 7131 7099)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6970 7388 7356)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7356 7516 7516)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7581 7741 7741)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7870 7934 7934)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8095 8159 8159)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4529 4561 4561)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5653 6360 6360)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6135 6456 6456)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5910 6585 6553)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6713 7195 7163)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7838 7966 7966)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8127 8159 8159)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5204 5942 5910)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6199 6778 6778)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6810 6810 6810)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7324 7581 7549)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7581 7773 7773)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7934 7934 7934)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7870 7966 7966)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7838 7998 7966)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8159 8159 8159)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8095 8191 8191)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8191 8191 8095)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4112 4818 4786)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5653 6071 6039)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5878 6296 6264)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6039 6553 6521)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6938 7388 5461)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6296 6746 6746)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7131 7356 7324)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2987 3019 3019)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7388 7549 7549)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7324 7581 7581)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7870 7998 7966)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7838 7998 7998)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8159 8191 8159)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8127 8191 8191)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7677 7741 7741)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7549 7806 7806)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4818 5493 5461)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5910 5942 5942)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6810 7195 7163)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7484 7516 7516)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7067 7388 7388)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7645 7773 7773)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8159 8191 6842)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7549 7838 7806)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7934 7966 7966)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7870 7998 7998)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8159 8191 8191)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8191 8191 8159)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3694 3694 3694)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3565 4112 4079)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5814 6360 6328)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5718 6424 6360)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6521 7003 7003)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8095 8127 4979)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8030 8127 5718)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7259 7645 7645)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7324 7645 7581)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7613 7806 7806)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7966 7966 7966)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7870 8030 7998)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8191 8191 8191)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7838 8030 8030)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4401 5043 5043)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5493 6199 6167)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5686 6424 6424)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6424 6746 6713)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7709 7773 7773)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7902 8030 7998)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4369 4401 4401)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4658 5268 5268)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5268 5975 5975)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6264 6842 6810)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7099 7420 7420)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7388 7613 7613)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7452 7581 7581)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7966 7998 7998)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7902 8030 8030)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4176 4176 4176)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5075 5075 5075)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5236 6039 5975)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6328 6071 5525)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6039 6617 6617)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8191 8191 3565)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6681 6970 6970)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7324 7677 7645)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7645 7838 7838)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7581 7870 7870)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7966 8030 7998)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7998 7998 7998)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3790 4401 4369)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4176 4882 4850)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5268 6039 5975)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5975 6328 6328)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6199 6553 6553)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6007 6681 6617)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6360 6810 6810)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8127 8159 4369)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7227 7388 7388)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7452 7645 7581)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7677 7838 7838)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7645 7870 7838)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7613 7902 7838)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7966 8030 8030)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4947 5525 5493)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5750 5782 5782)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6424 6810 6778)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6874 7259 7227)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7131 7452 7452)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7484 7613 7613)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7709 7838 7838)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7677 7870 7838)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7645 7870 7870)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7998 8030 8030)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7966 8063 8030)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6456 6521 2345)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5782 6456 6456)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6456 6456 6456)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7388 7677 7677)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3052 3116 3116)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7677 7870 7870)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7806 7806 7806)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7677 7902 7838)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7645 7902 7870)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7613 7902 7902)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8030 8030 8030)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7998 8063 8030)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4272 4529 4529)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3983 4690 4658)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7966 8063 8063)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5429 4626 6649)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5300 6039 6039)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5846 5300 6232)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5686 6199 6167)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5589 6232 6232)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6328 6874 6874)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8191 8191 3694)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6970 7227 7227)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6874 7292 7259)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7259 7420 7420)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7773 7838 7838)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7709 7870 7870)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8030 8063 8030)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7998 8063 8063)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6392 6842 4850)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6649 7067 7067)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7516 7645 7645)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7452 7677 7677)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7420 7709 7677)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7388 7709 7709)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8030 8063 8063)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7998 8095 8063)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4465 4818 4786)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4497 5139 5107)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5589 5589 5589)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6007 6071 6039)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5557 6296 6264)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5975 6424 6392)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6456 6842 6842)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6360 6906 6874)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7163 7163 7163)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7709 7902 7902)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7838 7838 7838)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7773 7870 7870)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7998 8095 8095)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8063 8063 8063)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3309 3373 3373)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5686 5910 5878)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6713 6842 3919)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5942 6617 5589)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5942 6456 6424)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6103 6713 6681)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7581 7645 7645)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8030 8095 8095)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3341 3726 3694)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4015 4047 4047)) ) collect: [:each | (each at: 1) value perform: (each at: 2) withArguments: (each at: 3)])) usingBits: (ByteArray fromPackedString: 'JG=?_2 (JB!?_2 (_7=?_2!?JG=?JB (_7=?JB (JG<(JB!?_2!?JG<(JB!?JB (JB (_7=?JB!?JG<(JG<(JB!?_2 (JB!?_7=?_2 (_7<(_7<(JB!?JB (JG<(JB!?_7<(JG<(JB (_7<(_2 (_7<(_2 (JG<(JB (_2!?_7<(_2!?JB!?JG=?JB (JB (JB!?JG=?_2 (JG<(JB (JB (_2 (_2 (JB!?JG<(JG<(JB (JG<(JG=?JB (JB!?_2 (JB (JB (JB (_7=?JB!?JG=?_2!?_7<(JG=?_2 (JB (_2 (_2 (JG=?_7=?JB (JB (JB!?_2 (_7=?JB (JB (JG<(_7<(_7<(JB (_7<(JG=?_7<(_2 (JG<(JB (JG<(JB (_2!?_7<(JG<(JB!?JB (JG<(JG=?JG=?JB (_7<(JG<(_2 (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JG<(JG<(_7<(JB (JB (JB (JG=?_7=?_7=?_2!?_3P(JB (JB (JE$(JB (JB (JCPFP XFJB (JB 4JB (JB (MB (JB (VR (JG<(_2!?_2!?_7<(JG<(_2 (JB (JB (JG=?_7=?JG=?JB (JB (JB (MCP(JB (JG<(JB (JB 4JB 4MB (JCP(JB (JCP(JB (VR (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JG=?_2!?JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JG<(_2!?_2!?JB!?_2!?_2 (JB!?_2!?_2 (JB (JB (_2 (_2!?_2 (JG<(JB (_2 (JG<(_2 (JG<(_7<(_7<(JG=?_7<(JB (JG=?JB!?JG<(JB (JG<(_2 (JB (JB (JB!?JG<(_2 (JB (JG=?_7=?JB!?_2!?_7=?_7<(JG<(JG<(_2!?_7<(JG<(JG<(_7=?JB (_2 (JB (_7=?JB (JB (_7<(JG=?JB!?_2 (_2 (JB (JB!?_7<(_2 (JG<(JG<(JG<(JB (_2 (JG=?_7=?_2 (_2 (_7=?JG=?_2!?JB (_2 (JG<(JG<(JB (JB!?JB!?JB (JG=?JB!?JB (JG<(_7=?JB (JG<(_7<(JB!?_7<(JB!?_7<(JB (JB (JB (_2 (JB!?_7<(JG=?JG<(_2 (JB (_2 (_2 (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!?_7=?_7<(JB (JB (JB (JB (JB (JB (JB!?_>[A0TKA7$HFA XFMB (JB (JB FP,!BP)1B9 X(A#P''A XFA XFA XFA#P(JB (JB (_7=?_7=?_7=?_7<(JB (JB (JB (JB!?JG=?_2#&0\G^0];AA XFA XFA XFJB (_7=?A-;A7-;^9 XFA"\FA XFA XFA#P(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (_7=?_7=?_7<(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JG=?JB (_2!?JB (_2 (JG=?_2!?JG<(_2 (_2 (JB!?_7<(JB!?JB (JB (JG=?JG=?_2!?JB!?JB!?_2 (JB (JB (JG=?JB!?JB!?JB!?_7=?JB (_2 (JB (JB (JG=?JB (JG<(JG<(JB (JG<(JB!?JG<(JB (_2!?_7=?JB (JB (JB (_7<(_7<(JG<(JG<(JG=?JB (JG<(JG=?_2 (_2 (JB (_2!?JG<(_2!?JG<(JB (_2 (JB (JG=?_2 (_2!?_7<(JG<(JG=?_2!?JG<(JB (JB (_7<(_7<(JB!?JB (JB!?JB (JG=?JB (JB!?JB (JB!?JB!?_2 (JB (JB (_2 (JB (_2 (JB!?_7<(JB!?JG=?_2 (JB (JG<(JB (JG<(JG<(JG<(JB!?JG<(JG<(JB!?_2 (JB (JG<(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!?VR!YVU%YJB (JNY=''G5=''I2\0_7&7=<(JB (JE%YML#HI\!=''I2\->[&9.[&7=?_7=?_7=<(JB (JB!YVR (JB (JB (JB (JB (JB (JB (VU$(JB (JB#&''I2\_W5=_^[&7=?_7=?_9#Q?VR (JB!=_W5=''I2\7>[&9.[_7=?&7=<(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JG<(JG=?JB (JB (JG=?JB!?_2!?JG<(JB!?_7<(JB!?_2 (_2 (JB!?JB (JG=?_2!?_2 (JB (_7=?JB!?JB (JB (JB!?JB (JG=?JB!?_2 (JB!?JB (JG<(JG<(JB (_2 (JB (JB (_2!?JB!?JG<(JB (_2 (JB (JG=?JG=?_7<(JB (_7<(JG=?_2 (JG<(JB (_7=?JG<(JB!?JB (JG<(_2 (_2!?JG=?JG<(_2!?_2 (_2 (JB (JB!?JB!?JG<(JB (JB (_7<(JB!?JG<(JB (_2 (_2!?JB!?JG<(JB (JB (JB (JG<(_7<(_2 (_7<(_2!?_2 (JG<(JB!?JB!?JG<(_2 (_7=?JG=?_7=?JB (_7<(JB (JB (JB (JB (_7=?JB (JG<(JG=?JB!?_2 (JB (JB!?_7=?JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (_5%YVU%YVU$(JE%QTRUQTRUQIY3A-;^7*B!YVU%YVU$%]GP%IUD%TUE=0[^7-;^7''I2\''I27JB (JB (JG<(JB (JB (JG<(JB (JB (JB (JE%YJE%YVU%YTUD%IRT%TRV7-;^\-927-92\VU$(JB (_UEQIRUQTRV7-;^7-927''I27JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JE$(\R (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!?JG<(_2 (_7=?JB!?JB (JB (JG=?_2 (JB!?_7<(JB (JB (_2 (JG<(_2 (_2 (JB!?_2!?JB!?_7<(JG<(JG<(JG<(_7=?JG<(_7<(JB (JB (JB (_2 (JG<(_2 (_2!?JG=?_2!?JG<(_2 (JG<(JB (JG=?JG<(JG<(JB!?_2 (JG=?_2 (JG<(_2 (JG<(JB!?JB!?JG<(JG<(_2!?_7<(JB (JG<(_2 (JB (_2!?_7=?JG<(_7<(JB (_7<(_7<(_2 (_7=?JG<(JG=?JG=?JG=?_2 (_7=?_2!?_7=?_2 (_2 (JB!?JB (JG<(_2 (_2!?_7=?JB (_2 (JB (JB (JB (JB (JB!?_2 (_2!?JB!?JG<(JB (_2!?_7<(JB (_2!?JG<(JB (JB (JB (_2 (JG<(JB (JB!?JB!?JG<(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!YVU%YVU%YVU&\7M3\7M3\7M1=''I2\_''6\MCQYMCP4-7N>7M3\7M3\7BV\''I2\''G5=_W5=A" (JB (JB (JB (JB (JB (JB (JB (JB (JB!YVU%YVU%Y7=3\7M3\7M0D''I2\''F==_W5=/-=YVU%YVP[\7M3\7M3\AI2\''I2\[75=VR (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JE%YVU%YVR (JCSA3#P(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JG=?JG<(JB (JG<(JB (_7<(_2!?JB (_2 (_2!?JG=?JG<(_7=?JB (JB (_2 (_7<(_7<(_7<(_2 (_7<(_7<(JB!?JG=?_2 (_7=?JB!?JB (JB (JB (_2 (_2 (JG<(JG=?JG=?JG<(JB (_2 (JG<(_2 (JG<(JB (JB (JB (_2 (_2 (JG<(_7<(JG<(JB!?JB!?JB!?JB!?JG<(JB (JG<(JB!?JB (JB (JB!?_7<(_7<(JB (JB!?JB (JB (_7<(JG=?JB (JG=?_2!?JB (JB (JG<(_2!?JG<(_2!?JG<(_2 (JB!?JB!?JB (JB!?_2 (JG=?JB (_7<(JB (_2!?_2 (JG=?JB!?JG<(JG<(_2!?JB (_2 (JG=?JB!?JB (JB (JG<(_2 (JB!?_2 (_2 (JB (JG=?JB (JB!?JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (VU%YVU%YVSQY/''*S^''):$9M:XFA XF@%$3P4MCP4MCS\^''):^''*S^)M:TVA XFA TUEQXB (JB (JB (JB (JB (JB (JB (JB (JB (JB (_5%YVU%YVUE:^''):^''):IVA XFA XFA /'')QVU%YME$(_)NS^''*S$7*>XFA XFA ?R (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (VU%YVR (JI1 XFA ''B (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (_7<(JB (JG<(JB!?JB (JG<(JB (JG=?JG<(JB!?_2 (JB!?_2 (_2 (_2 (JB (JG<(_7<(_7<(JG<(_2 (_2 (_2 (JG<(_2 (_7<(JB (JG<(_2 (JG=?_2!?JB!?_7<(JG<(_2!?_2!?JB!?JB (JG<(JB (JG=?JB!?JG=?JB (_7<(JB (JG=?_7=?_2 (JB (JB (JB!?JG<(JG=?JG=?_2!?_2 (_2 (JB (_2 (JB (JB (_2 (JB (JB (_2 (_2 (JB (_7=?JG=?JB!?JB (JB (JG<(JB (_7=?_2 (_2!?JG<(JB (_2 (JB (JB (JB!?JG=?JB!?_2 (JB (JB!?JB (_7<(JG<(_7<(JB!?_2 (JB (JG=?_7=?_7<(_2 (_2 (JG<(JB!?_2 (JB (JB (JB (JB!?JB (JG=?JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JE%YT$YYT%IFQ"L#H2L#H2L#^"P$IBT$TBMYT#P4MEH4JBL#H2L#H2L#H2L%IBP%IBP$IB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!YVSQRT%J>H2L#H2L#H2P$IBP$IBT%IBL#/%IRT%IRT%I=H2L#H2L#H2T$IRP%72 (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JO4$IBP$IRS=JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JG=?JB (JB (JG<(JB!?JG<(_2!?JB (_2 (JB (JB!?_2 (JG=?_2 (_2!?JG<(JB (_7=?_7<(JB (_2 (JB!?_7<(JB!?JB!?_2!?JB (JB!?JG=?JB (JB (_7=?JG<(JG<(JB (JB (_2!?_2 (JB (JB (_7<(_2 (JG=?JG=?JB (_7<(JG<(JB (_2!?JG<(JG=?JB!?_2 (JG=?_2 (_2!?JG=?JB (JG=?_2 (JG=?JB!?JG=?JB (_2!?JG<(_2 (_7=?JB (JB (JB (_2!?JB!?_7=?_2 (JB!?_7<(JB (_2 (_2!?JB (_2!?JB!?JB!?_2 (JB (_2!?_7<(JG<(_2 (JB (JG<(JG<(_2!?_2!?JB (JB!?JG<(_7=?JB!?_7<(_2!?JB!?_2!?_7<(JB!?JG<(JG=?JB!?JG<(JG<(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (MCP4MCP4MCS"/[6=/[6=/[;]7]7]/+7"MCP4MCP4MCSQ8+6=/[6=/[6=/-7]7]7]IE$(JB (JB (JB (JB (JB (JB (MED$7]4$TSP(JB (JCP4MCP4-K6=/[6=/[;]7]7]7]7]7[R=/W(4MCP4MCP4MMD#/[6=/[5:7]4%MB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!Q7]7]7]7]TR (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JG<(JG<(_7<(JB!?JB (_7<(_2!?JB (JB (JB!?JB (JB!?JB (JG=?JB (JG<(_7<(JB (_2!?_2!?JG=?_2 (JB (JB (JG=?JB!?_7=?JB (JB (_7=?_2 (JB (JB!?JG=?_2 (_7<(JG=?JG<(JG<(JB (JB (JB (JB!?JG=?JB (JB!?JG=?_2 (JB!?_7<(_2 (JB (JG<(JG<(JB (_2!?JB!?JG<(JB!?JG=?JB (JG=?JB!?_7<(_7<(JB!?JB!?_7<(_7=?JB!?_7=?JB (_2 (_2!?_2 (JB (JB!?_7=?_2 (JG=?_7<(_2 (JG=?_2!?_7<(_2 (JB!?_7=?JB!?_2 (JB (JG=?JB!?JB (JB (JB!?_7<(JB (_2 (JB (_2 (JG<(_2!?JB (_2 (JG<(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JE$(MCP(JB 48$=OS4=O[QR4-KR4-AQO8" 4MCP(MCP(JO6=S4=O[T=O[QR4-KR4<W<(JB (JB (JB (JB (JB (JB (I[R4-KR4-KR4IR (JB (T#P4JH)-S4=O[X*4-KR4-KR4-KS"[T=:JB (JCP(JCP(JI64EK6=H6<4JB (JB (JB (JB (JB (JB (JB (JB (_9S]/+;1''G<(JB (JB (JB (JB (JB (I[R4-KR4-BT(JB (JB (JB (JG=?JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!?JG=?_7=?JG<(_2 (JB!?_2!?JB!?JG=?JB (JB (_2 (JB!?_2 (_2 (JG=?JG<(_2 (JG<(JB (JB (_2!?_7<(_2 (JB!?JB!?JG<(_7<(JB (JB!?_2 (_2 (JB!?_2 (_2!?JB (_7<(JG<(JG<(JB!?JB (_7<(JB (JB (_2!?JG<(JB (JB (JB (JB!?JB (_2 (JG<(JB (JB (JB!?_2 (JB (JG<(JG=?JB (_2 (_2!?JB (JB!?_2!?JB (JB!?JB (JG=?JB (JB!?_2!?JB (_7=?JB (_7<(JB (JG<(_7=?_7<(_7=?_2 (_7<(JB!?_2 (_7<(_7=?JG<(JB!?JB (JG<(JB (JB (JB (_7=?JB!?_2 (_2 (_2 (_2 (_2 (JB (JB (JG=?JB (JB!?JB!?_2 (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JG=?JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (MB (JB (JE;[6=/[64=^W%9^W%9-65@(A" (A" (JB FJM5O6=/[6=-OW%:4''R (JB (VR (JB (JE$(JB (JB (-E9^W%9^W%9^W%:4JB (JB!?JB $6=-O8%9^W%9^W%9^W%9^S=/[IB (JB (J@X(JB (JB (JB (JB (JB (JB (JB!YVUIYJB (JB (JB (_%9^W%9^W%9^_" (JB (JB (JB (JB (JME^W%9^W%:7JB (JB (JB (JG<(JG<(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!?JG<(_7=?JB!?_7=?_2!?JB!?_7<(_2!?JG=?JB (JB (_2 (JB (JB!?_2 (_2 (JG<(JG<(JG<(JB!?JB (JB (JB!?JB!?JG<(JB (JG=?JG=?_2!?_7=?_2 (_7<(_2!?JB (JB (_7<(_7<(_2 (JB (_2 (JB (_2 (JB (_2!?JG=?JG<(JG<(_2 (_2!?JG=?JB (JG<(JB (_2!?JB!?JG=?JG<(_7<(_7=?_2 (JG=?JB (_2!?JB!?_2!?_2!?JB (_2 (_2 (_7<(JB (JG=?_2!?JG<(JB (_7=?JB (JG<(JG<(JB!?_7=?JB (JG<(JG<(JB (JG=?_7<(JB!?JG<(_2 (JB (_7<(_7<(JB (_2 (JB (_7<(JB (_2 (_7=?JB (_2 (JB (_2 (_2 (JB (JG<(JB (JG=?JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JG<FJG<(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB 4A/4(A"#Q,&-+,$<1ECDTECD16;KQA"#=JO7=?Q$ZA"#=?W81&$=O85 (JB (JB 4A" FA/4Z?R ZA%H(JB (7SDTECD1ECDTLSD1L[P(JB (JB (JAP1LQP1EAP1ECD1LQPTL].2,/4(?_7=A [=FQ$Z?P[=JA(4JB (JB (JB (_2 YJO4FA" (JB (JB (7SD1ECDTEAPTLQS1JB (JB (JB (JB (JB (-APTECF4JB (JB (JB (JB!?JO5?JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (_2 (JB (JB (_2 (JG=?JB (_7=?JG=?JG=?JB (JG<(_7<(_7<(_2 (_2!?JG<(JB (_2 (JG<(_7<(_7=?JB!?_2!?JB (JG<(JB!?_2 (JB (_2 (JB (JB (JB (JB!?JG<(JG<(JB (JB (_2!?_2 (_7=?_2!?_2 (JG=?JG=?JB!?_2 (JB!?_2!?JG=?JG=?JB (JB (_2!?_7<(JB (JB!?JB!?JB (JB (JG=?JG<(JG<(JB!?JG=?JB (JG<(JB (JB!?JB (JG<(_7<(_7<(JB (JB!?JB (_2 (JB (_2 (JB (JB!?_7=?_7<(_2!?JG<(JB!?JB!?JB (JB!?JB (JG<(JB (_2 (_7=?_7<(JB!?_2!?JG<(_7<(_7<(JB (_7<(_7=?_7<(JB!?JB (JB (_2 (JG=?JB (JG=?JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!??_5?JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (<SD1IB (JB (JB (JB F?_7=?^LQZ9+#8>O#8>O#86/#?_7=?_7=?_7=A/7=?P[=?_7=?Q((JB (JB F?_7=?_7=?_7==O7=A" (?^O#8>O#8>O#8>O#8>O#?R (JB (JB#18>O#8>O#8>O#8>O#8>O[D^O=?_7=?_7=?_7=?_74?_7=MB (JB (JB (M@[=?P[=?_7=?_44JB (INO#8>O#8>O#8>O#82P(JB (JB (JB (JB (JB!>^'')>JB (JB (JB (JB (JG=?JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JG=?JB (JB (JB (JB (_2!?JG=?JG<(JB!?JG=?JB (_2 (_7=?JG=?_2!?_7<(_2!?_7=?JG=?JB (JB (JB (JB (JB!?_2!?JB!?JB (_7<(_2!?_7=?JB (JB (JB (JG<(JG=?JG<(JG<(_2!?_7=?JB (JB!?JB (JB!?_7<(JG<(JB (_7<(_7=?_2 (JB (_2 (JB (_7<(JG=?_2!?JB (JB (JG=?_2 (_2 (JB (_2 (JG<(_7<(JB!?_2 (_2 (_7<(_2 (JB (_2!?JB (_7<(_2 (_7<(JB (JB (_2 (JB!?_2!?_2!?_7=?JB (_2 (JB!?JG=?JB (JB (JB!?_2 (JG=?JG<(_2 (_2!?JB (JG<(JG=?_7<(JG=?JB!?JB (JB!?JB!?JG<(_7=?JB (JG<(_7<(JG<(_2!?JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JG=?JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (EI*Z&)(TJB (JB (JB (JB (_7<(W)+F&)*Z&)*Z&,XS?_7==O74=M?==O7=?_74?_7=7?7=JB (JB#=?_S=7=?_?_7==OS4?_7=JE;F&)*Z&)*Z&)*Z&)*Z&*X(JB (JB (JLZZ&,ZZ&)*Z1)*Z&)*ZD=''Q=O74?_74?_7==O7=?_7=?WH(JB (JB (JO7=?_S4?_7=?_7=?R (_9*Z&,ZZ&)*Z&)*Z&)+F_2 (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!?JG<(JG<(_7<(JG<(JG<(JB!?JG=?_7<(_2 (JG=?JG<(JB (JB (JG<(JG<(_7<(_2 (JB (_2 (JB!?JB (JB (JG<(JG=?JG<(JB (JB (JB!?JG<(JB (JG=?JG<(JG<(JG<(JG<(_2 (JB (JG<(_2 (JG=?JB (_2 (JB (_2 (_2!?JB (JG=?_7<(JG=?_2 (_2!?_2!?_2 (_7<(JB (JB (JB (JB (JG=?_7=?_2 (_2 (_2 (JG=?_2!?JG<(_7=?JG<(JG<(JB!?JB (JB (JB (JB!?JG<(JB (JB!?JG<(JG=?_2 (_2 (JG<(JB!?JG<(JB (JG=?JB (JB (_2!?JB (_7<(_2!?_7<(JB (JG<(_7=?JB (JG=?_2!?JB (JG<(_2 (JB (_2 (_7<(_7=?JG<(_2 (_2!?JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (7U5.[%5.W]4(JB (JB (JB (JB (JB"&[&9][%5][&:&T/S44_S4=OS47?S4=OS4=OS_=OS4VR (JB!F=OS4=OSQ=OS4=N_4?_S4=CQ.[%5]WU5]WU5.WV9][&:ZJB (JB (JB ([%5.[%5.WV9.[%5]WV8$=OS4?_S_=OS4=OS4=OS==OP(JB (JB (_?S4=M?4=OS4=O749?74_=5.WV9][&9.[&9]WV9]W]4(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JG<(_2 (JB (JG=?JB (_2 (_2 (JB (JB!?_2 (JG<(_7=?JG<(JB (JG=?JB!?JB!?_2 (JB!?JG<(JB!?JB (_2!?_7<(JG=?JB!?JB (JB!?_2 (JB (JG=?JB (_7<(_2 (JB (JG=?_2 (_2 (_7=?_7=?JB!?_7=?JB (_2!?JB (JG<(JG<(JG=?JG=?_2!?JB!?JB!?JB!?JG=?JB!?JB!?_2!?JG=?JB (_7=?JB!?JG<(JG=?JB!?JG<(JB (JB (JB (JG=?_2 (_7<(JG=?JB (_2 (JB (_7=?_7=?JB!?JG<(_2!?JB (JB (JB!?JB!?_7<(_2!?_2!?JB (JG<(_2 (JB!?_7<(JG<(JB (JB!?_2!?JB!?_7<(_2 (_2 (JB (_2 (JB!?JB (JB (JG=?JB (_2!?_7=?JB!?JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!?JB!?JB (JB (JB (JI(SD1LSD1NZJB (JB (JB (JB (JB (JG>J&%5]&()?JB#_9=?''7=?_7=?Q7=G_7=?_9=?''92 (JG<$WU5A_-?''7=?_7=?_9=GQ9=G''D1LSD1LSD1LSD1LSD1LSD2 (JB (JB (JO5]D1LSD1LSD1LSD57=JM?_4]?Q4]?''=MG47=G_=M<(JB (JOR?W+2Z2M?_7=?''7=GQ7=G47=>ZD1LSD1LSD1LSD1LSD1NZJB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (_7<(_2!?JG<(_7<(JB (_7<(_2 (JG<(JB!?JB (JG<(JB!?_7<(JB!?_2 (JB!?JG=?_7<(JG=?JG=?JB!?JG=?_2!?_7<(_2 (JB!?JG<(JB (JB (_2!?JB (_7<(_2 (JG<(JB (JB (JG<(JB (JB!?JB (_2 (_2 (_2 (JG<(_2 (_2 (JG<(JG=?JB!?JG<(JB (JB!?_2 (_7=?_2!?JG=?JG<(_7=?JG=?JB (_2!?JG=?JB (JG=?JG=?JB (_2!?JB (JG<(JG=?JB (JB (JB (_2!?JG<(_2!?JB (JB (JB!?_2!?JB (JB (JG<(JB (JB (_2!?_2 (_2!?JG=?JG=?JB!?JB!?JB (JB (JG<(JB (JG<(JB (JB!?JB (_2 (JB (_2 (_2 (JB (JG=?JG<(_2!?JB (_2 (_2 (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB#_4]GQ4]<(JB (JB (JB!]/K2</K2<WR (JB (JB (JB (JB (JB (JB (JB (JB (7=GQ0)6]'']GQ4]GQ4]GQ4[_Q'']D(AV:<SS8>O+(P))7Q7=?Q4Y7Q'']GQ4T6</K2</K2</K2</K2</AL(JB (JB (JB (JE:</K2</K2Y^QQ2_7>]'']GQ4]GQ4]?Q4]GQ4]GQJB ()!N</BJ:O#:$W]GQ4]F74]GQ4]GQ/K2</K2</K2</K2</K2<D2 (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!?JG<(JB (JB!?JG<(JG<(JB (JB (JB (JG=?_7<(JG<(_7=?JB!?_7<(_2 (_2!?JG=?JB (_2 (JG<(JB (_7<(_2 (JB (JG<(_2!?_2!?JB (_7<(_2 (JG<(_2 (_2 (JG=?_2!?JG=?JG<(_2 (_2!?JB (JB (_2 (JG=?JG=?_2!?_2!?_2!?_2 (_2!?JG=?JB (JB (_7<(JB (_2!?_7<(JB!?JG=?_7=?JB (JG<(JG=?JG<(JG<(JB!?JG<(_2 (JB (JB (JB!?JB (JG<(JB (JB (JB!?_7<(JG=?_2 (_7<(_2!?JB!?JB (JB!?JG<(JB (JB!?JB (_7<(_2!?JB (JG<(JB (JG<(_2!?_2!?JB!?_2 (_2 (JB (JB!?_2 (JB (JB (JG<(JB!?JB!?_7<(JG<(JG<(_7<(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB#4'']GQ4]GQ92 (JB (JB (")&Y/I&</CD(JB (JB (JB (JB (JB (JB (JB (JB (JG=>VE!!VE!!_-GQ4]GQ4]GQ4]D(-K2</C:R+./+:>.<VG;Q'']GQ4]GQ4\J$&[2</K2<&[2<&W%9H''&<JB (JB (JB (JB (JDH1&)+F<W=?_2 (JFE04]GQ4]GQ4]F]'']GQJB!#D7$"6]&$:>/+++*$VI7Q4]GQ4]GQ77]9&W&Y^W$"H"H"^Y%9^[0(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!?_2!?JG<(JG<(JB!?_7<(_2 (JG<(JB (JB (_7=?JG=?_7=?_2!?JG<(_2 (_7<(JB (_2 (JB (JG<(JB (_2!?_2!?JB (_2 (_2 (JB (JB (_2 (JB!?JB (_2 (JG<(JB (JB (JG<(JB (_7<(_2 (JB (JG=?JB!?_7<(JB!?JB!?JB!?JB!?JB (JB (JB!?_2 (_7<(JB!?JB!?JG=?JB (JB (JB (JG<(JG<(JB (JG=?JB!?_2 (JB!?JB (JB (_2 (_2 (_7=?_7<(_2!?JB!?JG<(JG=?_2!?_7=?_2 (JB (_2 (_7=?JB (JB!?_2!?JG=?JG=?JB!?JB!?JG<(_2 (_2 (JB!?_7<(JB (JB (_2 (JG<(JG<(JB!?_2 (JB (JB (JB (JB (JG<(_2 (_7<(JG=?_7<(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (-967-;_B''[\(JB (JB (JB 0&Y&Y&QL(JB (JB (JB (JB (JB (JB (JB (JB (JB (-79>_''90''W9>-;_N''\J7''\K=")&Y&W&R:>/+:>/+:;10_+^]0)7B''Y67.9&Y&Y&Y&Y&Y^RH"H"H"D2 (JB (JB (JB (JB (JB (_2 (JB (JG<4XFB]''Y6]''Y6]4Y6]JB!2&W''Y6]''Y$''Y6]''Z-$)H$''Y6]4Y6]''Y57^T9NH-*;.;-76[/Y^W$SJB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (_2!?_2!?_7<(_2 (JB (JB (JN._%YTIO" (JB (:9VU%YUMJB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB#H:2&U%[%8JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (%YVU%P$(%YVU%P$(:9VU%YUMJB (JB (JB (JB (JB"U%YVUBR#+%YVU%T4(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (A)7Q4]GQ9=GQA" (JB (JB (JE80LH((JB#=''X2T'']D4_2 (JB (JB (JB (JB (JB!?JB"][79>XFA [6>]'']GQ4]G4=K2<&Y%9:>/+:>/+:>/+"&A 4]GQ4]F]4X)9&Y&Y&[2YH-$"6RH"H)4(JB (JB (JB (JB (JB (JB (JG<(JG=?JG>7#K^7''[^7-<HEJB (/G&;.;.;.9I6.[&9.^.RO)6]_)6]0)6]/BH"H'']7]7]7SW]7. 8OS)6]4R (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JG=?_2 (JG<(_2 (_2 (JB (2O=,[F1,[F0)2B (JK%,[F1,O" (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!M?&1,[F1,=.,(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JF1,[F2UJF1,[F2UJK%,[F1,O" (JB (JB (JB (JB ([F1,[IT(.V1,[F0>JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!?JB (_2!?JB (JB (JB!?JG<(JB (_2!?_2 (JG=-/K2=JCSQ''W9>_)R]''Q$(JB!?_7=?_2 (JB (JM?Q_''9>_''9>_)5Y_7<(_7<(JB!?_7<(JG=?_7=?_=E>_''9>_''9>'']GQ4]D(JE6</K2<H./+:>/+:>/+::Q0_'';Q4]GQ4]?_&+2</K2<^RH"H''^RC!A>_,IYJB!?JB!?JB (JB (\"!?\''I?JB!?\"!2\''IYA-G4=E$(_7=?W''''Z6[.;.;,>.[&9.[&9UP><''YR]''Y6]'']D"6'']MHT5M8QC!:>+*N%F]''Y5>''R!?JG<(JG<(JB!?JG=2\''H(_2 (_7<(JB (_2 (_2 (JB (_7=?_2!?JG<(JB (_2 (_7<(_7<(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!?JG<(JB!?JB!?JG<(JB (JO=,[F1,[F1,[B$(JB"9[F1,[C8(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB#H?&1,[F1,[F1,SR (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!,[F1,%R!,[F1,%R"9[F1,[C8(JB (JB (JB (JB (JF1,[F2UJK%,[F1,O" (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (_7<(JB (JG<(JG<(JB!?JB!?JG=?JG<(JG<(JG>Z/K2</I)?4VA XFA XI5?JB (JG<(JB!?JB!?JMGQ''VBLXFA XFA>XB (_2 (_7<(JB!?JB (_7<(_7=?Q95/XFA>XFCQ4]E?JG></K2</BK+:>/+:>/+:>,NIFA 4]GQ4]GQ4R 0/K2</BH"H)K+:>9XXFA>#O5?_7<(JB!?JB (JG=2JGI2\''=2_7=2JGH(_2 (_2 (_2 (JI%96[.;6[/YSWY6.[&9.WXOC95>4Y6]''Y4(EK/!8^G!DNFE=>+*:+->''Y6]4]GQJB (_7<(_2 (JGI2_7I2\''<(JG=?_2!?JB!?JB!?JB!?_2 (JB (JG<(JB (_7<(JB (_7<(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (_2 (JB (JB!?JB (JK%,[F1,[F1,[F1,O" (.V1,[F0>JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (.V1,[F1,[F1,[IT(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB ([F1,[IT([F1,[IT(.V1,[F0>JB (JB (JB (JB (JB!,[F1,%R"9[F1,[C8(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!?JB (_2 (JG<(_2!?JB!?JB (JG<(JB!?JG=?/K2</K2<_95>_''90_''B]JB (_7=?JB (JB (JMGQ4WA0_''9>\G9>_''9>_2 (JG=?JG<(JB!?JG=?JG=?_7=?JN^]''Y6]JB (JG<$/I&</I$"U^/+:>/+:>/+:3A>_,KQ4Y7Q4]E?JI*</G$"H*;+:45X_''9>_'';B72 (_2 (_2!?JB (_7=?_7=?_3P4_7=?_7=?_7<(_2 (_959^]''Y6]''Y6]$N]''Y6.[&9+ =P''W:]''Y6]_2"<8^G!)NG!Y.(I:+($\I6]''X2]''Y5?JB (JB!?_7=?\''=2\''=?JB (_2 (JG<(JG=?_2!?JG<(_2 (_7<(JB (JB!?JB (_7<(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JG=?JB (_2 (JG<(JB (JB#>[F1,[F1,[F1,[I<(JK%,[F1,O" (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JO9,[F1,[F1,[F1,^B (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JF1,[F2UJF1,[F2UJK%,[F1,O" (JB (JB (JB (JB ([F1,[IT(.V1,[F0>JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!?A YBP$IBI\#H2GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]KA*Z&)*Z''RS[T=OS4=-$7Q4]GQ4]GQ4]GQ4]NJ=/^IOS4=OS4=OS4=OS9-4]GQ4]GQ4]GQ4]GR>]GQ4]K94/''Q4]GQ4]GQ4]GQ46V)*Z&*.ZO\)JR$)JR$)JR&.S4=-/[6=/[4#]GQ4,1AK+#]HN+-O[T=OS4=O&;4#]GQ4]GQ4]GQ4]GPD_PQ9!S<>;.:E^_M=P''5BP$I=_THS8XW.;.;.;.;.C0$IBP''*:*5UH"P%IEEX?SP(JF:E!S:EUP$I:.F4"(+]7]6>IOG32I1BJE%YJB (MCQYT''=?\"!YJB (JG<(_7=?JB!?JB!?_2 (JG<(JB!?JG=?JB!?JG<(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JG=?JB (_2!?JB (JB!8[F1,[F0IBV1,[F3>JB"9[F1,[C8(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JG!,[F1,[@''6[F1,[N,(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!,[F1,%R!,[F1,%R"9[F1,[C8(JB (JB (JB (JB (JF1,[F2UJK%,[F1,O" (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (P$IB2L#H]GQ47L#H2L#H2L#\7L DAL D2@SH2@SH2L#H2L"$Z&)*Z*SH2L"SH2M:AL DAL DAL#H2L#HA@PTENO#[V5-[V5-[V5-[V5-AL#H2@SH2L D2@SH2G)+SRE9^, D2@PDA@SHAL#HABI*Z&)*C6#:JR$)JR$)JR$)C65-/[7#81PT2L D2@PD2G)-[V5-&65-[V5-[[4TE@PD2@PD2L#\7M3H2BK.;.;...;.;.;.H)1BP)1B''I1BH.FE;.;...;.;.:-BP$IBP&-U^D$IBP$%B (JB!Y75578S+-8SGH7]64IBP$<RP$IBQBA"!Y_5$(JEIRVW=?\" (JB!?JB!?JB!?_2!?_2 (JG=?JG<(_2!?JB (JB (_2!?_2 (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (_7=?JB (_2!?JB!?JB (O&1,[F3?JB#?[F1,[B (:9VU%YUMJB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB >[F1,[IT(.V1,[F29JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB ([F1,[IT([F1,[IT(.V1,[F0>JB (JB (JB (JB (JB!,[F1,%R"9[F1,[C8(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!BP,#H]GSH2L#H2L#HA@SH2L#H2L#H2L#HIRWH2L#H2L#H2L %2L#HIZPOR:SHI\ %IRT%IRWH2BWH2L %2BT%2BU:82O#H9)-[V5-[V5-[V5-[W+H2BWH2L#HI\#H<3=(ZO)(>&#./"T%IRT%2BWH2L#[C0<OR0?:ZC]ST5MST5MST>9-[[L#H>L#^"WH2L#H2L#"&&5-[V5-[V5-/V7"8"LTI\ %I\#H2L %AC>0.+*:.+*:.+*:.+(!''DIBP)1BP"JE![*:.+*:..::,C*_''9<IY:7!TUD$''SP(JE$(VU$(JEK17_G]7_F4<UEXTU! P%G39" (VR (VU%YVW=2\''I2JB (JB (_7=?_2 (JB (_7<(JB!?JB (_7<(_2 (JB (JG<(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JG<(JB (_2 (_2 (JB (JK%,[F1,%R (%V1,[F0>JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (.V1,[F2UJK%,[F1,%R (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JF1,[F2UJF1,[F2UJK%,[F1,O" (JB (JB (JB (JB ([F1,[IT(.V1,[F0>JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JDKH2GQ42L#H2L#H2L#H2L#H2L#H2DIBP''5BP''5=_Y2\''DIBP$IBP$IBP$IB''DJ\''DIBP)2\''I2\''I1BP)1B''DJ\P$J\''I1B"%:J"%8T8>O#8>O#8>O#81R4''DIBP$J\P)2\")!(>.7U5^7:ZJH1''I2\''DIB''DJ\''D-KR4-KZO)(%%MST5MST5M]8>M^"%9^-DIB''I1BP$IB8>O#8>O#8>O#8>O#W%A^W$J\P$IBP$IB_T-(+ <OC0<OC0<OC0=*;.F\P$IBP$J<;;@OC0<OC0<O+ <O;T"_''15&S]4$0^YBJCP4JB (JCPF7[;]<_G]<RQ VFABVGABI@X(JB (JE$(VUI2_7I?JG=?JB!?JB (JG<(_2 (JB (JB (JG<(_2!?JG<(_7<(JG<(_2 (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!?JG<(_2!?JB (JB (JB"9[F1,[IT(JIU,[F1,O" (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JK%,[F1,%R"9[F1,[IT(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!,[F1,%R!,[F1,%R"9[F1,[C8(JB (JB (JB (JB (JF1,[F2UJK%,[F1,O" (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (P$KH]GSH2L#H2L#H2L#H2L!BP$IB''DIBP$KAP$IB0TKAP$KAP$IBP$IBP$IBP$KAP$KAP$KA0TKAP$IB0TKAP,GAP$KAP,GAP,GAP(*&"(*J"!W#8>OF1.O#8>L1"$IBP$IBP,GA''F*"KN"U%YVU:D"CZOF7P,EBP$IBP$K/R4-KR6!J>.45%YVU%YT,8>L1"(*J),GAP$KA0TIBP#G#8>O#8>O#8>O#LX*J"()B0TIBP$IBP%_:;^7-%2-ST9W(J17:R0=K.4IBP''5BLP<OZO+-;_+:>.7:>.4C 14]GV7HP''5BP)1BP$IBP$K&759^"%9^"+QBIBP$P"QXIM5BP#P(JB (JB!Y\''I?JG=RT''<(_2!?_2 (JG=?_2!?JB (JG<(_7<(JB (JB (JB (JG<(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (_7<(JB (_7=?JB (JB (.V1,[F2UJB"U[F1,[C8(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB"9[F1,[IT(.V1,[F2UJB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB ([F1,[IT([F1,[IT(.V1,[F0>JB (JB (JB (JB (JB!,[F1,%R"9[F1,[C8(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (P$KH]L#H2L#H2L#H2L#HP$IBP$IBP$IBP$IBP.YBP.[&A" FJ@X(A XFJB (JB (J@XFJB (A X(J@X(JB (J@X(A X(A" (A" (JB FA"#]/:Z&2L"JEQPUENPUEQWH2L FA XFA" FA.FPRD#O????????%R0??R FJB (J@X(7T-KR4-KR$+:>$"U???O&QPT0LCHP" (A" (JB (A"">W!Q^EATUEQPTE\#H2H*4A" (JB (A+](>/+V:O??????????#6^"(*IQ_TIB_W5K(*KD 8NC ?*C 8NC <R"( ==P)1BP$J\P$J\0\G_9/5^"%9PW%;]/-7]7\#]7]6J''I0(JB!YJCP4VR (JI''/&I#WS"!?_7<(_2!?_7<(_2!?_7=?JG=?_2 (JG=?_2 (JG<(_2 (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JG<(_7<(_7=?_2 (_2 (JK%,[F1,%R (%V1,[F0>JK%,[F1,O""9[F1,[I?>[OZ9JB (JB (:?=,[O:_^B (JB (JK''?[F3>B\ (JB"9[F1,[@''>[O:92K''>[F0)SR (JB (JB (.V1,[F2UJK%,[F1,%R"9[F1,[@''>[O:92K''>[F0)SR (JB (:9U,[O:_2B (JF1,[F2UJF1,[F2U%V1,[F1,[IT(JB#+%V1,?)?HJB ([F1,[IT(.V1,[F0>JB#>[F1,[L (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JDKH]L#H2L#H2L#H2L!BP$IBP$IBP$IBP$IBJB (JB (JB 4MCP4JCP(JCP(JB (JB (JB (JB (JCP(JB (JB (MB (MB 4JCP(JB (MCP(JB 4E<C17_F&7\BJ]CDUEW257_G]JB 4MB (JB"W.K"8]YW?????????.I44JB (JB 4JB"<R4-KR4/D>/+:CD#(V3D10M5XJCP(JB (MB (MB 47]6J]AT1LQT1"-717\B&7R (JB 4JCPRR0NW????????????3;"85*J".<EBP,EBH*J"(,RC 8NC 8NC 8N"(&!9P$IBP$IBP$IB0TIBA XFW%9^W%;3<;:&/%9:TE9^^"WHP"!YVR FJB!YJHVXV5-[R4.EJB (JB (JB (_2 (JB (JG=?JB!?JB (JG=?JB!?JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (_2!?JG<(_2!?JB (JB"9[F1,[IT(JIU,[F1,O""9[F1,[C8(.V1,[F1,[F1,[K$(JB (%V1,[F1,[OYMJB (JO=,[F1,[F36^B (.V1,[F1,[F1,[OY,[F1,[OY8JB (JB (JK%,[F1,%R"9[F1,[IT(.V1,[F1,[F1,[OY,[F1,[OY8JB (''61,[F1,[OY8JB!,[F1,%R!,[F1,%YU,[F1,[F2UJB"_[F1,[F1,='' (JF1,[F2UJK%,[F1,O"!M[F1,[B$(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JDKH2GSH2L#H2L#H2DIBP$IBP$IBP$IBJB (JB (JB (JCP(JE$(JN?/VR (VU$(VU%YVR!YJB (JB (JE$(VR!YJB (VR!YJB!YJB (VR (JE$(VU$(JGCJ<_G1<_G1)/G1<_G1<ZZ&\B!YJE%YJB R][!5.K @:O???????>#ZJE$(JB (JE%YJK2"(*IK( OD 8OD6"!RJB!YJB (VU$(VU%YJE%YVU#1<_F4_G1<<_G1<_G1IE (VR (VR (5:JC:O??????????37T+]R-T()#&9$IBP$JX(*J"1HNC 5RC <R"R$)[P$KA9,EBP$IBP)2\P$K&P"Q4"+:4)+RJ"'')PW"M^-BWH2DH(VU$4A" (VW%[>"28.B2DR1H(_7<(JB!?JB (_2!?_2 (JB (JG<(JB (JB!?_2 (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JG=?_7=?JB!?_2 (JB (.V1,[F2UJB"U[F1,[C8(.V1,[F0>JK%,[F1,[F1,[F362B (.V1,[F1,[F1,=, (JK%,[F1,[F1,[IT(JK%,[F1,[F1,[F1,[F1,[F1,''2 (JB (JB"9[F1,[IT(.V1,[F2UJK%,[F1,[F1,[F1,[F1,[F1,''2 (O&1,[F1,[F1,%R ([F1,[IT([F1,[IVU[F1,[F1,%R >[F1,[F1,[F2UJB!,[F1,%R"9[F1,[C8(BV1,[F3+JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!B2GSH2L#H2L#H2DIBP$IBP$IBP$H(JB (JB (JB (JB (JB!YJB!YJB#W52!?_2!?JB (_7=?_2 (JB!?_2!?_2!?JG<(_2 (_7=?_7=?JG=?JG<(_7<(JG=?IDIBIA\$IBS1E?G1P$K1IB (_2 (_2 (R0@@@@A5@@@@MX>OMWT@R2 (JB (JG<(JG<(\M^/+:>/+:KWIB (JB (JB (_2!?JG<(_2 (_2!?P"P$IDHW<_G1IBS1IBQ2JB (_2 (_:J".@@53??????OMP@@@@@@.D*"JCP4MB (?ZJ"($*"R/+:U%Z"U*J/->YBP,EB''DIBP$KH2DIB0TIB/+R4D/(]KB0] =)^"-7A2DIBJB (JB 4VR"XG["8][!5]]MKJB (JB (JG<(_2 (_2!?JB!?_2 (_7<(_7<(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!?JB (JG=?_2 (JK%,[F1,%R (:;&9.[%8JK%,[F1,O""9[F1,[F1,[F1,[N,(JOY,[F1,[F1,[F29JB#6[F1,[F1,[F1,SR"9[F1,[F1,[F1,[F1,[F1,[F3HJB (JB (:61,[F1,2C:9.[&9:2"9[F1,[F1,[F1,[F1,[F1,[F3HJB%,[F1,[F1,[F1MJF1,[F2UJF1,[F2U%V1,[F1,[IT(JV1,[F1,[F1,[D4([F1,[IT(.V1,[F0>JO9,[F1,2B (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (P,!42L#H2L#H2L!BP$IBP$IBP$H(JB (JB (JB (JB (JB (JB (JB (JB (_2!?_2 (_2 (JG=?_7<(JB!?JB!?JB (JG<(JG=?JB!?JB (_2 (_7<(JB (JB (JDK10OD$<\($<_G1<_G1<RP(JB!?_2 (\EZV% @@% BV%)X@%)ZV@D-0JG<(JB!?JB (_7<(X8''ZS#I#JB (JB!?JG<(_2!?_2 (JB!?JG=?_2S1<_G1IOD$<_GJ<_D$JG=?_2 (JFN"49X@% BV%#VV%)ZV% BV@@CSR!$(JB (JB"]&C-VU%YVU$)JR$)K72 (P.YBP)1BP$I=_\!BP$IB''DJ;KK"8.K"8.D"8KK/&P)1BP#P(JB (MB (1K!5@@@@@IZV5&L(_2!?JG<(JG<(JG=?JB (_7<(JB!?_2!?JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!?_2!?JB!?JB (JB"9[F1,[IT(JB (JB (JB"9[F1,[C8(.V1,[F1,[F1,[F29JC9,[F1,[O9,[F1,JR >[F1,[F1,[F1,[K$(.V1,[F1,[F1,[F1,[F1,[F1,O" (JB (JD5,[F1,[N,(JB (JB (.V1,[F1,[F1,[F1,[F1,[F1,O"!,[F1,[OY,[F1,.R!,[F1,%R!,[F1,%YU,[F1,[F2UJF1,[F1,=&1,[F29JF1,[F2UJK%,[F1,O$5,[F1,JR (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (P$KH2L#H2L#H2L!BP$IBP$IBP" (JB (JB (JB (JB (JB (JB (JB (_2 (JB (JB!?JG<(JB!?_2 (JG=?_2!?JG<(JG=?JG=?JB (_2 (_7<(JG=?_7<(JB (_7=?_2 (IL/@<]+,KE+V6,CK2?D(_7<(_2!?JOG!%#T5%)ZVMSVV%)ZVMY[!<R!?JB (JB!?JG<(JG<(JG<(JB (JB!?JB!?_2 (JB!?_2 (_2 (JB (IJ[K<_D0LOG1<_D$JG=?_7<(JB!#U @5%)X5%#T5MST5MSVVMST5@C-YJB!YJB!YJE%N+>0,M#X,5*>YVR (JB (P$IBP,GAP$IB_TIBP,#!5)X5:ST5%".V@K#D6$IBP.X4JB (MB (FR0@@@BV%)ZV%+!G_2 (JB!?JB!?_7<(JB (JG<(_7=?JB!?_2 (JG=?JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!?_7=?JG=?_2 (JB (.V1,[F2UJB (JB (JB (.V1,[F0>JK%,[F1,:7!,[F1,%R#+[F1,[ET(?61,[O8(:61,[F1U^F1,[F2_JK%,[F1,:7!,[F1,?""9[F1,[K$(JB (JB (?&1,[F3>JB (JB (JK%,[F1,:7!,[F1,?""9[F1,[K%M[F1,[@''H[F1,[B$([F1,[IT([F1,[IT(.V1,[F0>JD5,[F1,B\!,[F1,JR!,[F1,%R"9[F1,[C:9[F1,[N,(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JDKH2L#H2L#H2L#HP$IBP$IBP$H(JB (JB (JB (JB (JB (JB (JB (JB (JB (_2!?JG<(_2 (JB!?JG<(_2 (JB!?_7=?JB!?_2!?JB!?JB!?JB (JB (JG<(_7<(JB (_2!?JB#19CX5MST5MST69_D(JB (JB!?JB#1PST5MST5:ST5MST5MST5P_D(_2 (JB (JG<(_2 (JB (JG=?JB (_7<(JB (_2 (_7=?JG<(JB!?JG=0LC 5MST5NAL$_2!?JG=?JG<(_3,5MSW):ST5MSW)MST5:ST5MSV/\" (_7=?JG<(4_F<V5QTR4;@''U$(JB (JB (J@YBP$IBP,GA''I3!!HQTKCW):ST5%%)JR ?ZP$IBJE$(VSP(VR"8%)X5%#T5MST@\" (_2 (_2 (JB (_7<(JB!?JG<(JB!?JB!?JB (_2 (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!?_2!?JB (JB!?_2 (JK%,[F1,%R (JB (JB (JK%,[F1,O""9[F1,[C8([F1,[IT(.V1,[F0>JIU,[F1,JK%,[F1,O"!,[F1,%R"9[F1,[C8([F1,[IT(O&1,[F29JB (JB (JK%,[F1,[K$(JB (JB"9[F1,[C8([F1,[IT(O&1,[F29O&1,[F29JF1,[F2UJF1,[F2UJF1,[F2UJK%,[F1,O" >[F1,[K$([F1,[IT([F1,[IT(.V1,[F0>?61,[O[HJB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!BP,#H2L#H2L#HP$IBP$IBP$H(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JG<(_7<(JB!?_7=?_2 (JB (_7<(_7<(JG<(JG<(_2!?JB!?JG<(_2 (_7<(_2 (JG<(JB!?JG<(73ZO#>'')#8?)#;!0_2!?_2 (_7<&<\2W:^&O#>&O:X?)#>'')4?GKX7<(JG=?JB!?JG=?_2!GX2 (_7=?_2 (JB (JB!?JG<(_7=?_2!?JB!?EYA5:^''):WVPER (JG<(JG<(_7E[#>''):^&O:^''):X?):^''):^'')R7=?_2!?JB (E?G1<_GK2</1)/G1JB (JB 4JB (JB (A"!B9$I.!HQTUERD$YBP!IET$\QJ(.MBP X(JB (JE%Y+9[)MSW)#>'')1G<(JB (JB (_2 (_7=?JB!?JB (_2 (JB!?JB (_7<(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (_7<(JG<(JG=?_2 (JB"9[F1,[IT(JB (JB (JB"9[F1,[C8(.V1,[F0>JF1,[F2UJK%,[F1,O""U[F1,[B"9[F1,[C8([F1,[IT(.V1,[F0>JF1,[F2UJC9,[F1,.R (JB (JB!8[F1,[F1,SR (JB (.V1,[F0>JF1,[F2UJC9,[F1,.S9,[F1,.R!,[F1,%R!,[F1,%R!,[F1,%R"9[F1,[C8(O&1,[F29JF1,[F2UJF1,[F2UJK%,[F1,UV1,[F2_JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JDKH2L#H2L#H2DIBP$IBP$IBJB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JG=?JOG1_2 (_2!?JB (JG=?JB (_2!?_7<(JB (JB (JB (JB!?JB (JG<(JB!?_2 (_2 (_:?D5+ 5:X<5]PFQR7<(JB (_2 (X?F69SVO#8>O#12O#8>OM^SL_FL(JB (_2!?_2 (\OGL_J[L<W9?JB!?JB (_2 (_2 (JB!?JG<(_2 (4\RD$\SD$\SD$S/Q_2 (_2!?JG<(U8>O#8>O#8>OGH>O#8<\#8>O#5]?JB (_2 (<_G1_J[1<_G1<_GL<_D(JB!YJE$(MCP4MB (JB (1IETUEQTG%P^UEQTUA9T!D)VP$H(JB 4JCP(V_D6:^&O#8>O]_D(JB (JG=?_2 (JG<(JB!?JB!?_7<(JB!?JG<(_2 (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (_2!?_2 (JB!?JB!?JB (.V1,[F2UJB (JB (JB (.V1,[F0>JK%,[F1,O"!,[F1,%R"9[F1,[C8(%V1,[F0(.V1,[F0>JF1,[F2UJK%,[F1,O"!,[F1,%R >[F1,[K$(JB (JB (JK%,[F1,[O<(JB (JK%,[F1,O"!,[F1,%R >[F1,[K$>[F1,[K$([F1,[IT([F1,[IT([F1,[IT(.V1,[F0>JC9,[F1,.R!,[F1,%R!,[F1,%R"9[F1,[@%,[F1,UR (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!B2L#H2L#H2L!BP$IBP$IBJB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JG<(_2#1<W=?JG=?_2!?JG=?JB (JB (JB (P,#12L!BJB!?_2 (_2 (JB!?JB (JG<(JG<(_72Q$YFQ$YFQ$YFQ$YE<JB!?JB (_2#H)<)N:Q0\#10\#10\:T;H<\ (_7<(_2!?_7=#2OF''2G31_L*''2D]?JB (JG<(JG<(JB (_7=?_7=?JF*Q$YFQ$YFQ$YFQZ" (JB (JG<(JD\\GA0\GA2OGA0\GA2OGA0\GA1GJB (JG=?2J_H2,"''2L#H2L*''<Z_H2B!YJB (JE$(VU$(JB 4)URDUEQTUEQTG!8-UES,;HPC1AMBJB 4MB (VR!#_ID5GA3)$ZY#JG=?JB!?_7<(_7<(_2 (_2 (JB (JG<(_7=?JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JG<(JB (JB (_7<(JB (JK%,[F1,%R (JB (JB (JK%,[F1,O""9[F1,[C8([F1,[IT(.V1,[F0>JIU,[F1,JK%,[F1,O"!,[F1,%R"9[F1,[C8([F1,[IT(O&1,[F29JB (JB (JB#H?&1,[F1,BR (JB"9[F1,[C8([F1,[IT(O&1,[F29O&1,[F29JF1,[F2UJF1,[F2UJF1,[F2UJK%,[F1,O" >[F1,[K$([F1,[IT([F1,[IT(.V1,[F3?[F1,=" (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (P,!42L#H2L#HP$IBP$IBP" (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JG<(JG<(JB!?JB!?JB (JB!?JB!B)<B'')</@0J]B_7=?_7<(JG=?JB!?JB (JB (JB"E$YET$YFQKYET$UQT!W<(JG<(_7<(0LBJ0LYZGJ.+*:,\V,[K2<CJ_7<(_7<(JG=?0LCJ)<C@2,"''2<C@X2!?JB (_2!?JB (_7<(_2!?JB"QKUQT$UQTUIFQUIE?JG<(JB (JB (1J.+*:.+*:.+GJ.+GJ.+*13D_7=?_2 (_*_@2<*''0H+@0L#@2:]AU6(!PR (_5$(VR (VR (JBATUEP^KUP-UN0^KR4AG G,1LSW''B (MB (JB (JGC@0JW%)<A0_7<(_7=?JB!?JB (JB (_2 (JG<(JB (_2 (_2 (_2 (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (_2 (_2 (JB (JB"9[F1,[IT(JB (JB (JB"9[F1,[C8(.V1,[F0>JF1,[F2UJK%,[F1,O""U[F1,[B"9[F1,[C8([F1,[IT(.V1,[F0>JF1,[F2UJC9,[F1,.R (JB (JB (JC9,[F1,[F0>JB (.V1,[F0>JF1,[F2UJC9,[F1,.S9,[F1,.R!,[F1,%R!,[F1,%R!,[F1,%R"9[F1,[C8(O&1,[F29JF1,[F2UJF1,[F2UJK%,[F1,[F1,[I<(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JDKH]L#H2L#H2DIBP$IBP$H(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!?JB (JB (JB (JB (_2 (_7=?JG<(_2 W27S@):^J",/K)?D(_2 (JG=?_2!?JB (JB"L<_GKV''WSG%QTUEQTUEP-UJ<(_2 (JB (JDK@0J^'')>T $UP 9\C@0LC@P''<(JB (JB (0J^'']LB''0LB''2:^''0L@(_2 (JG<(JB (_7=?JB!?JB"]UB5TUEP^UEQTKUQT''R (JB (JG<(JI4@*:.+*:-%YVV+YZ-%*10@''R!?_2!?_<C@2<+@0LC@0LB''0B@@*:.+*5P-+;0(_2!?_2!1L0^/G1<_G00AKR4-@PD^@^3,@Q9T@93&MCPFJB (_2 (Q?GK0OE#JB!?_2 (JG<(_7=?JG<(JG<(JG<(_7<(_7<(JG<(JG=?JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (_2 (JG<(JB (JB!?JB (.V1,[F2UJB (JB (JB (.V1,[F0>JK%,[F1,O"!,[F1,%R"9[F1,[C8(%V1,[F0(.V1,[F0>JF1,[F2UJK%,[F1,O"!,[F1,%R >[F1,[K$(JB (JB (JB (.V1,[F1,?" (JK%,[F1,O"!,[F1,%R >[F1,[K$>[F1,[K$([F1,[IT([F1,[IT([F1,[IT(.V1,[F0>JC9,[F1,.R!,[F1,%R!,[F1,%R"9[F1,[F1,[F1UJB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!B2GSH2L#H2L!BP$IBP$IBJB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!?JB!?_2 (_2!?JB (JB!?_2 (JB (_2!B0LC@)8+K0J_J2:_@\B!?JB (JB!?_2!?''\BJ)<C@0GU%YQ15@Q8^G"4-G"6/_2!?_2 (JB (2</10OG@0J_K0L/@0LC@)2!?JG=?_7=?\L/@0LBJ27S@)<C@0LC@\G<(JB (_2 (JB (_7=?JG<(''R4-KR7,G!8-@PDAG)5?_2!?_7<(JG<(PPA%YVU%*6U%YVU%*:,@L"!?JG=?_6N''0LB'']J^''0L/@/@A%YZ-%*6VWG"7,U)5?_8A$A0]D8NC 8NC9G03,@^3,@^3,;N3,G!9BP" (A" (VR (_2 (_7=?JB!?JB (JB!?_2!?JB (JB (JB (JB!?JB!?_7=?_2 (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!?JG=?JB (JG<(JB (JK%,[F1,%R (JB (JB (JK%,[F1,O""9[F1,[C8([F1,[IT(.V1,[F0>JB (JB (JK%,[F1,O"!,[F1,%R"9[F1,[C8([F1,[IT(O&1,[F29JB (JB (JB (JB#?[F1,[F3+JB"9[F1,[C8([F1,[IT(O&1,[F29JB (JB!8%V1,[F2UJF1,[F2UJF1,[F2UJK%,[F1,O" (JB (JG"U[F1,[IT([F1,[IT(.V1,[F1,[F36JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (P,!42L#H2L#H2DIBP$IBP" (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JG<(_2 (_7=?_2!?JG<(JG<(_2!?_2!?)<B''0LA4)<CK0LB''2<A#JG<(JG<(_2!#0LB'']LB'')<2W*:-%YVUZ;B4-;B4-HB (JB (_2!?JN_J)<B''0LB''2,CK0J_K0I4(JG<(_7<(JLC@0LCK)<C@0LC@0K1Z#10A$RB]JG<(JB!?_2 (JG<(JB"Q@PDAKQ8-KR4-KQ9?JG<(JB (JB!?JD^''KZ-%YZ-%YVV+YVTA)4\(_7=?_2"]):_K)</H)<B''.6U%*:.+*:-%]R4AG!:Q"&P3QDQ;!07T5MPM@ K9G00-;N0A;N3,@^0-0THFJ@X(JE$(_2 (JB (JG=?JG<(_2 (JG<(JB (JG<(_2 (JB!?JG<(_2 (JG<(_7<(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JG<(_2 (_2!?JB (JB"9[F1,[IT(JB (JB (JB"9[F1,[C8(.V1,[F0>JF1,[F2UJK%,[F1,O" (JB (JB"9[F1,[C8([F1,[IT(.V1,[F0>JF1,[F2UJC9,[F1,.R (JB (JB (JB (SV1,[F1,?" (.V1,[F0>JF1,[F2UJC9,[F1,.R (JB"9=&1,[F1,%R!,[F1,%R!,[F1,%R"9[F1,[C8(JB (JK''6[F1,[F2UJF1,[F2UJK%,[F1,[F1,''2 (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JDKH]L#H2L#H2L!BP$IBP$H(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (_2!?JB (_2!?JB (_2 (JB!?JB (P*_@2,C@)<BJ):_@)]L\@B6QHFL(JG>]0LCK0L"J)<CKHZ-%YVU%YYX8NC -KTD(JG<(_7<(JB (E:_@2</K2*^52*^52DI?_7=?JB (JB!4)</K2<C@):^''0J=%YVV+$N0-@T9?JG<(JB (JG=?JB (R24^@R4^;B4-@R5KJG<(JB (JB (JB!?98*%NA2*YVU%MPFH]N]?JB (JG<(#L/@27S@28)AS(JBYZ-%*6V+*0@-KR4-G!>TQG.G!+GTB (JB +T@ K9CB8A;@G,;@G,@4IBJB (JB (_2 (_2 (_7=?JB (_2!?JG<(_7<(JB (JB!?_2!?JG=?JB (JG<(_2 (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JG=?JB!?_2 (JG<(JB (.V1,[F2UJB (JB (JB (.V1,[F0>JK%,[F1,O"!,[F1,%R"9[F1,[C8(JB (JB (.V1,[F0>JF1,[F2UJK%,[F1,O"!,[F1,%R >[F1,[K$(JB (JB (JB (JB"_[F1,[F1MJK%,[F1,O"!,[F1,%R >[F1,[K$(JB"_[F1,[F1,[IT([F1,[IT([F1,[IT(.V1,[F0>JB (JI=,[F1,[F1,%R!,[F1,%R"9[F1,[F1,[D4(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!BP,#H2L#H2L#HP$IBP$IBJB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (_7=?_2!?JB (JG=?JB!?JB (JG<(JLC@0J^''0J_K):^''.11% (H8N@FQ<R"])</K0LA40L.''0J\@*:-%?&1,MZBW+ID(JG=?JB (JB (JB"]0GSK):_@0L+@)94(JB (JB (JB!G):^''0J_K2<C@)5Y%YVV+YU(^G G,S"!?_2 (JG=?_2 (_=D^KR4^G"4^@R4-=B!?_2!?_2!?JB (JB"]9Q#%9[2<P\.J0FL(JG<(_2!?_7;J28)<)>WF1&U,[L_>YVU%*6T@G!8-K";98H^F,]"#(P(JB (JB *!@/$L@PDA@PG,@^=BP X(A" (JB (JB (_7<(JB!?JG<(_2!?_2!?JB (JB (JG=?JB (_2 (JB!?JB (_2 (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!?JB (JB (_2!?JB (JK%,[F1,%R (BYVU%YUMJK%,[F1,O""9[F1,[C8([F1,[IT(.V1,[F0>JB (JB (JK%,[F1,O"!,[F1,%R"9[F1,[C8([F1,[IT(O&1,[F29JB (JB (:9VU%YTISV1,[F1,.R"9[F1,[C8([F1,[IT(O&1,[F29JB"_[F1,[F1,[F2UJF1,[F2UJF1,[F2UJK%,[F1,O" (JI=,[F1,[F1,[IT([F1,[IT(.V1,[F1,[F1MJB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JDKH2L#H2L#H2DIBP$IBP$H(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!?JG=?JB (JB!?JG=?_7<(JG<(JB#@0LC@0LB''0J^''"FW>[F36%:BWNB500GS@0LB''0GS@"*_@)Q1%161,[L]543!B_2 (JB!?_2!?JG<(JB!B2,CK)<C@P"!?JB (JG<(JG<(Q<A4)<B''0LC@);1% (J*YVUZG!8A;IF]JG<(JB!?JB"]P''CQLC#S+ML8@Q:Q9R (_2 (JG<(_2 (JG<(_6MBP^TX1!!A''W<(JG<(_7<(JB"]2:_@P^WF9UY,[F1,[L]%YZ-%]R4^@R8_8LN#SM"#(30JB (JB (JB HBG28-@^0AG.1]P,D(J@X(MB!?_2 (JG<(JG<(JB!?JB!?JB!?JB (JB!?JB (JB (_2!?JB!?_7<(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!?_2 (JB!?JG<(_2 (JB"9[F1,[IT(JIU,[F1,O""9[F1,[C8(.V1,[F0>JF1,[F2UJK%,[F1,O" (JB (JB"9[F1,[C8([F1,[IT(.V1,[F0>JF1,[F2UJC9,[F1,.R (JB (JK%,[F1,%R#?[F1,[IT(.V1,[F0>JF1,[F2UJC9,[F1,.R"9[F1,[F1,[F1,%R!,[F1,%R!,[F1,%R"9[F1,[C8(JK%,[F1,[F1,[F2UJF1,[F2UJK%,[F1,[F1,BR (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!B2L#H2L#H2L!BP$IBP$IBJB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!?JB!?JG=?_2 (JG<(JB!?<X+@)<C@2,CJ]E+6[F1,=)^,4:2,4<C@)</@)<-40L/@)72<YV1,[F1,? EB_7=#JG=?JB (_7=?JB!?JG<(Q6MGJG<(_2!?_2 (JB (JB#@)<C@0LC@0DD6[F1,[L^*NB4-KR4-HG=?JB (JOGK0LA4FLZ<$]N,+MMK4W<(JG=?JG=?JB (JG<(_7=#X7=#_7=?_2!?_7<(JB (JG=?X<C@]L[F1.V+[F1,[F1,16V+*:0^KPDL>_ *J*N#6JN#4 (JB (JB (J@/$L@PG,@^2QP.YBJCP(A"!G_6M#JB (_7<(_7<(JB (JB!?JB (_7<(_2 (JB (JG=?JG=?_7=?_2!?JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JG=?JG<(_2!?JB (.V1,[F2UJB"U[F1,[C8(.V1,[F0>JK%,[F1,O"!,[F1,%R"9[F1,[C8(:;&9.[$(.V1,[F0>JF1,[F2UJK%,[F1,O"!,[F1,%R >[F1,[K$(JB (JB"9[F1,[IT(BV1,[F2UJK%,[F1,O"!,[F1,%R >[F1,[K''H=&1,[F3?[F1,[IT([F1,[IT([F1,[IT(.V1,[F0>JL#6[F1,[O=,[F1,%R!,[F1,%R"9[F1,[F1,[O8(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (P,!42L#H2L#HP$IBP$IBP" (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JG=?JB (JB!?JG<(JG<(_2 (JB (JB!?JL*''2*]4):_K0LB*[F1,[O;S4:3SGJ*50H+@0L/J)<#@):_@FLX M!0\M"C1X6M#X7<(JB!?JB (JG<(JG<(JB!?_6M#JFL(JB (JB (JB!?0LC@)<A4)3HX*&1,[F1,?)@^G!8-KYE?_2 (X:^''0LCK9^WF1,[''<_E?X7<(JB (_7=?JB (_7=?X7=?_2!?_6M?JFM#JB (JG<(JB!?JB#@2.W%1.V%=&1,[F1,[F3>*:,-KQ8AG>CCB@"#(:N#(30JB (JB (JB-PBG28-G G,)R#&P X(JB 4Q6M?_7<(JB (JB (JB (JG=?_2 (_7<(_2 (JB!?JB (JG=?_7=?_2 (_2 (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JG=?JB!?_2 (JK%,[F1,%R (%V1,[F0>JK%,[F1,O""9[F1,[C8([F1,[IT(.V1,[F0>JIU,[F1,JK%,[F1,O"!,[F1,%R"9[F1,[C8([F1,[IT(O&1,[F29JB (JB (.V1,[F2UJK%,[F1,%R"9[F1,[C8([F1,[IT(O&1,[F29UV1,[F3?2F1,[F2UJF1,[F2UJF1,[F2UJK%,[F1,O"!U[F1,[O?H[F1,[IT([F1,[IT(.V1,[F1,[F1,UR (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JDKH]L#H2L#H2DIBP$IBP$H(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (_2 (JB!?JB!?JB (_2 (JB!?JB (JB!B2,CK0LC@2<C%161,[F1%+J2,4?;GPZ^'')<C@2<CK)<.'']L[%1.W%1.W%FFM#_7=?_2 (_2!?_7=?JG=?_7=#_2 (_2!?_2 (JB (_2 (JG:''2<*''0J_F)_Y,[F1,[A3SG"4AKR4-JG<(JL#@)<C@P\[F9\[F9T\(_6L(JB (JB!?JG<(_2 (_7=?X7=#_2!?_6M#_<,!+:=V+2E>JG=?''Z_F9\[FHF1,[F1,[F1,16T6G"4ACO''8J HK:N#(:OX>@(JB (JB (J@/$.KPDA8R (P.X(JB YJE%?X2!#X2 (_2!?_2!?_2!?_7<(JB (JG<(JB (_7<(_7<(JG<(_2 (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!?_7=?JG=?JB (JB"9[F1,[IT(JIU,[F1,O""9[F1,[C8(.V1,[F0>JF1,[F2UJK%,[F1,O""U[F1,[B"9[F1,[C8([F1,[IT(.V1,[F0>JF1,[F2UJC9,[F1,.R (JB (JK%,[F1,%R"9[F1,[IT(.V1,[F0>JF1,[F2UJC9,[F1,.[%,[F1,UR!,[F1,%R!,[F1,%R!,[F1,%R"9[F1,[C8(.V1,[F1UJF1,[F2UJF1,[F2UJK%,[F1,[F1,[I<(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!B2GSH2L#H2L!BP$IBP$IBJB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JG<(JB (JG=?_2 (_2!?JB (_7<(_7<(JLC@0LC@0J^''1,],[F3GM*2W%3Y,1<[@]LA42,BJ0J_K0DGF1,[F9^WF1.V]_6M#_2!?JB!?JG<(JG=?_2 (_7<(_7=#_7<(JB!?JG=?JB (0LB'')<AA1,[6[F1,[O9Z49@-;@D-G''=?_1_@0LB'')3K%9\[F1,YAX6M?JB (_2 (_2 (JG<(JG=?X7=?JFM?_7=?0IGS;B4^K^3,KUZL_2!49^WF9UY,[F1,[F1,[F1%;B7,KQ? 00 HBD&#(:N#(=#8B (JB (JB*G CB4^8UH(JN[&A" YFR!YQ7<(_7=?JB!?_2!?JB (JB!?_2 (JG<(JB (_7<(JB (_2 (_7<(JB!?JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JG=?JG<(JG<(JB (JB (.V1,[F2UJB"U[F1,[C8(.V1,[F0>JK%,[F1,O"!,[F1,%R"9[F1,[C8(%V1,[F0(.V1,[F0>JF1,[F2UJK%,[F1,O"!,[F1,%R >[F1,[K$(JB (JB"9[F1,[IT(.V1,[F2UJK%,[F1,O"!,[F1,%R >[F1,[K&9[F1,[C8([F1,[IT([F1,[IT([F1,[IT(.V1,[F0>JK%,[F1,O"!,[F1,%R!,[F1,%R"9[F1,[O=,[F36JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (P,!42L#H2L#H2DIBP$IBP" (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!?_7<(JB!?JB (JG=?_6M?_2!?JG=?_2!B0LB''0GS@2!"B[F1,YY^W%=L\[HK%",/@)<B'')<B5)<AA9\[F1.WF9\[FE2!?_7<(_2!?JB (JB (JB!?JB!?_7=?_7>HH[-A_7<(JB!?JFO@0LB''9\Z%*&1,[L\6+ML8K^0AG)D(_2#H2<CK0L/%1,[F1,[F1$]?X7<(JB!?_7<(JG<(JB!?JG=?_7<(X6M?D-OS%3 AG"4-@Q8-K[0(Q>W%1#IV[F1,[F1,[F3>V"4AKQ8_@"(HB@!I(:OX(:N#6C3RB (JB +T8A>D9U$(JB!BP X(JB (Q2!#_7=#_2 (_7<(_2!?JG=?_2 (JB!?_2 (JB (_7=?_2!?_2!?JG<(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (_2 (JB (_2 (JK%,[F1,%R (%V1,[F0>JK%,[F1,O""9[F1,[C8([F1,[IT(.V1,[F0>JIU,[F1,JK%,[F1,O"!,[F1,%R"9[F1,[C8([F1,[IT(O&1,[F29JB (JB (.V1,[F2UJK%,[F1,%R"9[F1,[C8([F1,[IT(O&1,[F29.V1,[F0>JF1,[F2UJF1,[F2UJF1,[F2UJK%,[F1,O""9[F1,[C8([F1,[IT([F1,[IT(.V1,[F2_[F1,[ET(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JDKH]L#H2L#H2L!BP$IBP$H(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!?_2 (JB (_2 (JB!?X2!#X2 (_7<(JG=?_?G@0LB''0LC%M&1,*)_S+I^WYV069X*''",C@)<CK0J_@P\[%1.W%1,[%9Z]1X6L(_7=?JB!?_2!?JB (_7=#X7=?X;,8+MO,KYDRJG<(_7<(X:_@0A#F1#Y,[O86%:2,NB4^;A8 JB#''2:^''0J_J9^W%1.WFFNW1X7=#JG=?JB (_2!?_7C@9^UA2)5?_6M#D-N,%:08KPD^@R4^KQ8A/B!G9\[FHF1,[F1,[F2BM# AG"7,G>@*B@ HRZN#(:N#(:N#6C384-KRCV&3YB!YJCPFP.XFJB 4ME$(_7=?X7<(_7<(_2 (JB!?JB (JB (JB!?_2!?JG=?JB (JB!?JB (_7<(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (_2 (JG<(_7<(_2 (JB"9[F1,[IT(JIU,[F1,O""9[F1,[C8(.V1,[F0>JF1,[F2UJK%,[F1,O""U[F1,[B"9[F1,[C8([F1,[IT(.V1,[F0>JF1,[F2UJC9,[F1,.R (JB (JK%,[F1,%R"9[F1,[IT(.V1,[F0>JF1,[F2UJC9,[F1,.[%,[F1,O"!,[F1,%R!,[F1,%R!,[F1,%R"9[F1,[C8(.V1,[F0>JF1,[F2UJF1,[F2UJK%,[F1,:61,[F2_JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JDKH2L#H2L#H2L#HP$IBP$IBJB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JG<(JB (_7<(JB (JB!#X2!?JB!?_7=?_2!?P,C@2</@9QO>YY^,4:2W48JB/NV''0L#@)<B''0L*''0DGF1,[F1.W%1,YA_7=?X2 (JB!?_2!?JB (JB (JFM?X4.W+J08KQ8-G"@(JG=?JB (\J]A1.WZ !1Z(MOS(I@-KPD-''W<(_,+J):_K)>W%9^WF1.W%)6M#JB (JB (JG=#E<*'']L[F9\[%L)4(<]N,%=NW$A8-G D^@R4-KR4W_7?19X#6[F1,[O85%=L8KR4-G!? J HBJN#(:N#(:N#(:OX(:N#SHY;A7E?JB 4JNYBA" 4JB!YQ7=?X6M#JG<(JG<(JG<(JB!?JG=?JB (JB (JG<(JB (JB (_2!?_7=?JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JG<(_2!?JG=?JB (O&1,[F3?JB#?[F1,[B (.V1,[F0>JK%,[F1,O"!,[F1,%R"9[F1,[C8(%V1,[F0(.V1,[F0>JF1,[F2UJK%,[F1,O"!,[F1,%R >[F1,[K$(JB (JB >[F1,[IT(.V1,[F29JK%,[F1,O"!,[F1,%R >[F1,[K&9[F1,[C8([F1,[IT([F1,[IT([F1,[IT(.V1,[F0>JK%,[F1,O"!,[F1,%R!,[F1,%R"9[F1,[C;>[F1,=, (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JDIB2GSH2L#H2L#HP$IBP$IBP$H(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JG<(JG<(JG<(JB (_2 (JB (_2 (_7=?JG<(_2 (P,C@0H)4"C",+I_S%9]%8ZU42:_J0LB''0LCJ0J^J1,[F1,[%9\[FPW=?X7<(JB!G<\B''0LC1Q2!?JG=#X=* %9^,@R4AKPD-D''<(_7<(JB!?JI6]Q=*W+J2W(I\-G"7,S''<(JG:''0L/@):_%1.W%1.WF9Z]?_2!?JB!?_7?''28+@0LC%9\[F9\[FP)FW%:3S+B7,KPD-KR7,K^0AU''=?X2"]]VU%#3ZW+MNW@R4AK^0_8B(HB@ =(:N#(:OX(:N#(:N#6D2GQ@^@_5%YJB#&9.X(''_DW%E%?X6M?JB (JG<(_2!?JB (_2 (JB (JB (JG<(JG<(JB (_2 (_2 (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (_2 (_2!?JB!?JB (JG!,[F1,[@$I[F1,[O8(JK%,[F1,O""9[F1,[C8([F1,[IT(UV1,[F29^O9,[F3?JEU,[F1,.T5,[F1,BR"9[F1,[C8([F1,[IT(O&1,[F29JB (JB (^F1,[F1,B_Y,[F1,:2"9[F1,[C8([F1,[IT(O&1,[F29.V1,[F29O&1,[F2UJF1,[F2UJF1,[F2UJEU,[F1,''7"9[F1,[K$>[F1,[IT([F1,[IT(.V1,[F0>BV1,[F3+JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!B2L#H2L#H2L#H2DIBP$IBP$IBJB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!?JB (JB (_2!?JB (_;.Q$[,(JG=?JB!?JG<(JB!?JB (JFOQR3" 43!*)^W%]J_@0L+@0H*J0L+@0NWF1,[F1,[F1*]#X7<(_2#10J^''0H+K0LC1JB (_7<8%:2WNB4-@R4A@YD(JG<(JB!?JB (_7=?H]N,+I^PG"6QD" (JB#''"*^'')<CJ)>W%9^W%1.W1_2!?_4HS.;,!/LCJ)<B''9^WF1.W%9](5+J2W43 AG!8^KPDA@R4AKQ;1_7=#X1JW(I^W4:2W418A@PDACNCCB@!@(:N#(:N#(:N#(:N#6M"1!4P3_2!YJCP(P$IB-ODUEQTU\G=#_7<(JB (_7<(_7<(_2 (JG<(_7=?JG<(JG<(JB (JB (_7<(_2 (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!?_2 (JG<(JB (?&1,[F1,[F1,[F2_JB"9[F1,[C8(.V1,[F0>JF1,[F2UJD5,[F1,[F1,[F1,''2!M[F1,[F1,[F1,[K$(.V1,[F0>JF1,[F2UJC9,[F1,.R (JB (JB#>[F1,[F1,[F1,[G (.V1,[F0>JF1,[F2UJC9,[F1,.S9,[F1,[F1,[F1,%R!,[F1,%R!,[F1,%R!8[F1,[F1,O&1,[F1,[F1,[F2UJF1,[F2UJK%,[F1,O$5,[F1,JR (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!B2L!42L#H2L#H2L!BP$IBP$IBJB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (_2 (_2 (JB (_2"QUERQJG<(_7<(_2!?JB!?JB (JG=?_2!?Q6M#X<#$","''",+J2L#H2(+H2L"59^S$E^S$9NQB_7=#JB#H2H*''2L+H):^''<_D(_2"%NC"PUERQ$YFQ$YETPW=?_2 (_2 (_2 (_2#1+9CV$\RE''R (JB (JH+H)<#H2*^J9NS%9^S$Q2!GU0MTUID8GA3)$NWH2(+$E^PX9NP8=#X8NC"Q$YFQ$YET$YFQUIFQU7=?_6M#UC 8NC 8NERQUIFQ!HS9>B(*SM"#(:N#(:N#(:N#(:ML!''-DJG<(VU$(JNZ4W+;]<ZY4EWS1JG=?JG=?_2 (JB (JB (JG=?JG<(_2!?_7=?_2 (JB (JG<(_2!?JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (_2 (JB (_2 (JG=?JB (JK%,[F1,[F1,[F1,O" (.V1,[F0>JK%,[F1,O"!,[F1,%R (?&1,[F1,[F1,[N,(JO9,[F1,[F1,[F18JK%,[F1,O"!,[F1,%R >[F1,[K$(JB (JB (.V1,[F1,[F1,[IT(JK%,[F1,O"!,[F1,%R >[F1,[K$([F1,[F1,[F1,[IT([F1,[IT([F1,[IT(JIU,[F1,[B!,[F1,[F1,[F1,%R!,[F1,%R"9[F1,[C8(?&1,[F3HJB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JDIB2L!42L#H2L#H2L!BP$IBP$IBP" (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JG=?JG<(JB (JG<(_2 (1LSDN7=?JB!?JB (JB (_2!?JB (JG=?X7=#X2!G),26<\313OGL<_GL<_G13G0U9NS$E^S$4W=?JG?1<_G1<_G1<\313L1<<R!?D,SD1HSD1LSD1LSD1AI?_7<(JB (_2 (JB (JB (JG<(JB (JG=?JB#1<_G1<_GL<\1<]AW$_B RN<SD1LPCM^'')#8>OR?G1_ATUETG$]_Z*$ICD1LSD1LSD1LSD1LSD@4,(X6M#_?FP$I@8$A;D1LSD1HQVG>CCSD3X(="#6JOX(="#(=#X,X]DL7E?JE$(JB $EH+]<_G1<_G1<]D(_2 (JB (_9''D1D9?_2 (JB!?JB (JG<(_7<(JB!?_2!?JB!?JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (_7<(_2!?JB (JB (JB (?61,[F1,[F1,JR (JK%,[F1,O""9[F1,[C8([F1,[IT(JEU,[F1,[F1,[O<(JB!U[F1,[F1,[F0IJB"9[F1,[C8([F1,[IT(O&1,[F29JB (JB (JL#>[F1,[F1,[F1MJB"9[F1,[C8([F1,[IT(O&1,[F29JI=,[F1,[F1,[F2UJF1,[F2UJF1,[F2UJB!M[F1,[F0(''61,[F1,[F1,[IT([F1,[IT(.V1,[F0>J@%,[F1,:2 (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (P$KH2GSH2L#H2L#H2L#HP$IBP$IBP$H(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!?JB (JG<(JG=?JG<(JI%V+9%?JB (JB (_2 (JG<(_2 (_2!?JB (JB!?JOF&IL/K<RS1<_G1<\/1<_F&24E<PQU<PW=?_4]0<_G1IL/K2?D$<_G1<RQ#JD8;U%YVU#-VN3,CU%Z<JB (JG=?_2 (_7<(_2 (_7<(JB (_2 (_7<(JJ[12?GK<_G1<\/1<R ?U#-VN5YV5#T5%#VVMST8<_GK_AUAE^''>?#!VN5YVU MVU#-VN5X;U#.X_2!?_6M?EUS,CC,;N3,;U L;U%XB!8Z1SD3X6M#X6M#X6M!L,XY;QFQ?JB U&T;FEH*J)+S1<_G1P"S1JB (JB!?JB"/U#-VJB!?JG<(JB (JG=?JG<(_7<(_7=?_2 (JG<(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!?_2 (JB (JB (JL#?[F1,[F1,J\ (JB"9[F1,[C8(.V1,[F0>JF1,[F2UJB (.V1,[F1,[O?HJB (J@%,[F1,[F2U2B (.V1,[F0>JF1,[F2UJC9,[F1,.R (JB (JB (S_9,[F1,[O[+JB (.V1,[F0>JF1,[F2UJC9,[F1,.R!8=&1,[OY,[F1,%R!,[F1,%R!,[F1,%R (JEW6[F1,JG#6[F1,=&1,[F2UJF1,[F2UJK%,[F1,O"!M[F1,[IT(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JDIB2L!4]L#H2L#H2L#H2L#HP$IBP$IBP$H(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JG=?JB (_2 (JG<(_2!?JG=?JB (JB (JB!?JB (JB (_7<(JG<(JB (JB"]IDHW<RP$IOD$E1\WIOD$IL@$2*Y4]GB&5:=KRK#S^_D$<RS1<RS1<_G1P''>''+:>"(%Z"(*>/(*>/)''=?_2!?JG=?_2 (JB (JB!?JG<(_7=?JG<(JB!?IOD$2DK1IBP$IGJE+:>/(*>/+20@@@@@@GU5]]X$IBP$0KV8MP@,(*>/+:J/+:J/(*>/+:>/57<(JB!?_7=B5:>/+:J/(*J/+:< #DRG!+ELSM#X6M#X6M!L,XZGQCN@''XV"(*>"5''T]D;;1IBP$IDIBIGH(JB!?JB!?+:>"+2 (JB (JG=?_7<(JG<(JG<(_7=?_2 (JB!?JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JG=?JB (_7<(JG=?JB (JB (JN._%YTIO" (JB (:9VU%YUMJN.U%YVUSR"U%YVUBR (JB!8BYVU''>,(JB (JB (O &U%Y=UJB (JN.U%YVUSR"U%YVUBR!M%YVU%^,(JB (JB (JB#H:2&U%[%8JB (JN.U%YVUSR"U%YVUBR!M%YVU%^,(JG"_%Y=8%YVU%P$(%YVU%P$(%YVU%P$(JB (2N._%R (^I>U''7"U%YVUBR"U%YVUBR#+%YVU%T4(JB&U%YVU2B (JB (JB (JB (JB (JB (JB (JB (P$IBP$KH2L!4]L#H2L#H2L#H2L#H2L!BP$IBP$IBP$IBJB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (_2!?JG=?_7=?_7<(_2 (_7<(_7<(JG<(JB (_2 (JB (JG<(JG=?JG<(JBP$<_D$<_EBIBP$P/D$P"S1<TIBIBSZV5-[R4!HRD""IDK1<TK1<TK1<_D(_9!KR5-[R5-KV5-[&B!?JB (JG<(JB!?_2 (JG<(_2 (_7=?JG=?JB (JB!BIBP$IDIBP''><V5-[R4-[R5,,RD!HRD!HRD!HHBS1P$H$5$!HRE-KV5-[R5-KV5-[V5-[V8U2_2!?JB!?JB#FO5-KV5-KV8V%\SLG^8^F!+F1SD1LSD21,XZG^0\39E-KR5-KR6Z8RB0!<?EB<RP$P"S=_2 (JB!?JCBXV3A?JG<(_7<(JB!?_2 (JG=?JG<(_2!?JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JGQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]GQ4]L#H2L#H2L#H2L#H2L#H2L#H2DIBP$IBP$IBP$IBJB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!?JB (JG<(_2!?JG<(_7=?JB (JB (JB!?JB!?JB!?JG=?JB!?_7=?JG<(JB!R\DIBP$IBP$IBP"Q0P$I!P$I!P$I7;>?/;=\,KB0,KE-BVDIBP$IBP$IB_7=.5=_W;>?/5>?/;9%0P&E!P(9RJG=?JB!?JB!?JB (JB!?_2 (JB (_2!?JB#4'']G4JB!?HM_/;=_W;=_.%20,KB0,KB0,KB14P&EBXB@,KA7W5>?/;>?W5>?/(!4]KB0 ''UI?JB (_2!?_2 (<^S$<R (_2!$L0]D^8^F!+F1,[FF!(];Q@\38=_/5=_W&I :KB0,GRH$VDIB#H9X=B (_2!?JB (JB (JG<(JB!?JG=?JB (JG<(_2 (_2 (JB (JG<(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!47L#H2L DA@PDA@SH2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L!BP$IBP$IBP$IBP$H(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (_2!?_2 (JG<(JB (JB!?_2 (JB!?JB!?JG<(JB!?_2!?JB (JOQ0\GA0\GA0\GA0\GA0\GA0\G@1!XVE!XVEGVX]Y&Y&"WA0\G@$\GA0\B!?_4:E!XVE!XVE;;A0IGA0\GA0\G8(_2 (JB!?_2 (JB!?_2!?_''25#B!?_2 (_7<(JB (D8VE!XVE!XVE!]U&GVX]Y&X]Y!4]O7A0\G@1Y!7UO8VE!XVE!XW/5Q5&Y!5&LWA0\B (JB!?JG<(_7<(JG=?JB (JHA$A4QD^8^G!(^G!7-DQCM$98VE!XVE!XVEC14]Y&Z-W$IB\GBL_%H(JG<(JB (_2!?_7<(JG=?JG<(JG<(JB (JG<(JB (_7<(JB!?JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (7L %2L %2BWHI\#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#H2L#HP$IBP$IBP$IBP$IBP$IBP" (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JG<(JB!?JB!?JB (_7<(_2 (JB (JG=?JB!?JB (JB (_7<(JB!?JG<(_2 (_7<(FW9X#G9>VGA0_%"L\IQ>\G8YD"D!HRD!HV]''N&]''Y0>L_''A0_'':L\G8(JB (EG\!HREWO7&]_'':L_%!>_''9X\GI?JB!?JB!?JG=?JE8R]5\!HU]7.59?JB (JB!?JG\!HRD!HRD!U5_-Y3(:Y6\:Y6]''N.5X_''A0#@=''+RD!HU\!HRD?Y3(:Y6]''C79>\GA>VR (JB (JG<(JG<(_7<(_7<(JG=$A0]D^4Q;^4PGA6R@JG$!HRD!HREW8^D:N#*-;ZQXXFA>''W8(JG<(_7<(JG=?JB (JB!?JG=?_2 (JB (JB (_7<(JB!?_2!?JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JL#HP$IBP$J\P)2\''DIB''DIBP$J\P$J\P$J\''I2\P$J\P$IBP$J\''DJ\''DIBP)2\''DIBP$J\''DJ\P$IB''DJ\''I1BP)2\P$IBP)2\P$IBP$J\P$J\''I2\P$J\''DIBP)1BP$IB''DIBP$J\''DJ\''DJ\''I1BP$IBP$IBP$IBP)2\P$IBP$J\P)1BP$IBP$IBP$J\P)1BP)1BP$IBP$J\P$J\''DIBP)1BP$IBP)1BP$IB''I1B''DIBP$IBP$J\''DIB''DJ\''DIBP)1B''DIBP)2\P)1BP)2\P$IBP)1BP)1B''I1BP)2\''DKAP$KA0TK&P.[&A X(A#P(MB (VR!YJE$(JG<(_7=?JG<(JG=?JG=?JB (_2 (JG=?JB (_2 (_2 (_7=?JB!?_7<(JG<(_2!?JB (_2 (_2 (JB!?JG<(_2!?_7=?JB (JB (JG<(JB (JG<(JB!?JB (JB (JB (JB!?_2 (JB (JB (JB (_2 (JB (_2 (JB (_2!?JB (JB (JB (JB!?_2 (JB (JB (JB!?JB!Y''Y6L''Y6]_)6]''Y6]''Y5YJK.;.=*;.;-*UZ:.+*:.%I6]''\J]#G;BJB (JB!?VAU^II7B''W:]''Y6]''Y5>''Y6]_7=?JB (_2 (IAJ;.;/Z.;.;.;.;D&D(JB (JOR;6+.;.;/Z.;.;.*9U+%UU+*:.UUUU-G:]#I6&++*;.=+Z6-)7+%V.UUUU++V]''X2]#I5?JG<(JB (_2!?JB (_2 (JGH(JHA$L3LGA3L3L6P(JB#Z.;.;.;.;6+.;;%W-UYJRIV>\'']DYJB!?JG<(_2 (_2!?JB!?_2!?JB (JB (_2 (JB!?JB!?_2 (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB#HP$IBP$IB0TIB0\GAP,EB0TIB0TIBP$IB0TIB0TKA0TIB0TKAP,EBP$IB0TKAP$IBP$KA0TKA0\EBP,EB0TKAP$IBP$IBP$KA0\GA0\EBP,EBP$IBP,EBP$IBP$IBP,EB0TIBP$IB0TIBP,EBP,EBP$KA0TIB0\GAP,EB0\EBP$IB0TIBP$IB0\GAP,EBP,EBP$KAP$KAP$IBP,EBP,EB0TKA0TIBP$IB0\GA0TIBP$KA0\EBP$IB0TIB0TIB0TKAP,EB0TIBP$IB0\EB0TKAP$KAP,EBP$IBP$IB9$K&P.YB9$H(A" (A X4JCP4JB!YVU$(JB!YJB (_2 (_7<(_2 (JB (JB (JG=?JB!?JB (JB!?_2 (_2 (JG<(_2 (JB (JG<(_7<(JB!?JB (_2!?_2 (JG<(JB (JB (_2 (_2 (_7<(_7<(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB F4]GQ4]GB4]GQ4R (JGI9^W%9^Y%9.9JR$)JR$$KQ4]GQ4Y7Q\" (JB (JB (JN_Q4Y7Q4]F]4]GQ'']GQ4]D(JB (JB (W)%9^W%9^W%9^W%9&Y%9"" (JB#1^W%9^W%9^W%9^]&R$)JR$)JR$)JR$%6]4]GQ4\X"&W%9^W%9;)JR$)JR$,[Q4]GQ4]GQ4R (JB (JB (JB (\!V<^W%9&QLU\""@ HB@JB (JB!X^W%9^W%9&W%9^RH>C9K.O#F\-97=JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (P,EBP" (JB (J@X(A X(A" FA" (J@X(J@XFA" FJ@X(JB (J@X(A X(J@X(JB FA X(JB FJ@X(J@X(JB (A" (A" FJB FA" FJB (JB (JB FJB FJB (J@XFJ@X(J@XFJB (A" FJB (JB (A" (A" (JB (JB FA X(JB (A X(A" (A X(A" (JB FJB (JB FA" (JB (J@X(J@XFJB (J@X(JB (J@X(J@XFA" (J@XFA" (J@XFA" (A X(JB FJ@XFA X(JB (J@XFJ@XFJB FA" (J@X(J@X(JB (JB (MB!YJE%YJB (VW<(JG<(JB (JB (JB (_7<(_2!?_7<(_7=?_2 (JB (JG=?_7<(_7<(_2!?JB (JB (JB (JB!?JB (_2 (_2 (JG=?JB!?JB (JG=?_7=?_2!?_7=?JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JO74=OQRJB (JB!?D1LSD1LSD1MM)JR$)JQ>7=?_4]?_=B (JB (JB (JG?''7>_Q7=?Q7>_Q4]?''7=G__2 (JB (2ALSD1LSD1LSD1LSD1LSD1N4JB (/1LSD1LSD1LSD1LSDJR$)JR$)JR$)JQ]4]?_4]G4IALSD1LSZ:R$)JR$)CG_4^__7=?_9?Q?JB (JB (JB ("#@SD1LSD1LSD1NJJB (JB (JB (<QLSD1LSD1LSD1N<,$6$)ABZ%I0(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JDKAJB (JCP(JB (JB (MB (JB 4JCP4JB (JB (JCP(JCP(MB 4MB 4JB 4JB (JB (MB (JB 4JB 4MCP(MB (JB 4JCP(MB (JCP(MCP4MCP(JB 4JB 4MB (MCP4MB 4JB 4JB (JB 4JB (MB 4JCP(JCP4JCP(MB 4JB 4JCP(JB (JB (JB (MB (MB (JCP(JB (MB (JB 4JB 4JB 4JB (MCP(JB 4JCP(MCP4JB (MB (MB (MB (JB 4JB (MB 4JB 4JB 4JB (JB (JCP4JB 4MB (MB (JB (VR!YVR (JE%Y_2 (JB (JG=?JG<(_2!?_2 (JG<(JG<(JG=?_2!?JG<(_2 (JB (JB (_2 (JB!?_7<(JG<(JB (_2 (JB!?JB (JB!?JG<(_2 (JB (_2!?_7<(JB (JB (JG<(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JL[F1,[F1,Z38=''Y6]''Y?]?=?_7=?R (JB (JB (JB#==N_4?_74?_S=?_S4?]?=?_4(JB (4\[F&,[F&-,QD]''YDRK[1)*31-D(JOE.[&:31,[F1,[F,4?Y6]''Y6]''Y6]''Y8?7==M?=JB 4EL[F1!GY6]''Y,'';=?_7_?_7=?_7=JB (JB (JB (L\[F1,ZZS1M-1,[F1#D(JB (JB (JBSF1,[F1,[F1,ZZ&&5-D=/[^.X(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!BP" (JB!YVR (JB!YJB!YVR (VU$(VR!YJB!YVU%YVR (VR (JB!YJE$(JB (JE%YVU$(JE$(JB (JB!YJB (JE$(VR (JB!YJE$(VR (JB (VR (JB (JB (JE$(JE$(JB!YJB (JB (VR (JE%YVR (JE$(JE$(JB!YVR (VU$(JE$(JB (JE%YVR (JE$(JB (VR (JE%YVR (JB!YJB!YJE%YJB (JB!YJB (JB!YJB!YJB!YVR (JB (JB (VR!YVR!YVR (JE%YVR!YJE$(JE$(VR (VU%YVU$(JB (VR (JB (JG<(JB!?JB (JG=?JG<(_7<(JG<(_2 (_2 (JG<(JG<(JB (JG<(JG<(_2!?JB (_2 (JB (_2 (JG<(_7<(JG<(_7<(JB!?JB!?_2 (JB!?_7<(JG=?JB (_7<(JB (_7<(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JE$(JEH(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB"4W%9^W%9^TE9^S;J2[R (JB#=MB (JB (JB (JB (JB (JB (JB (JB (JB (JB#=JB (JE9^W%9^[]/[,+K[,-/[6=--W%9^JG= EAPTEAPTW%81W%9^&+K[6;K[6=.26=7=7=?4JB (JB!YVH)-[V5^''R (JB (JB (JB (JB (JB (JB ("%9^EF7[,-/[,+I-EE9P-B (JB (JB#''W%9^TEAPW%A^LQPT8>O#?G5BP" (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (P" (JB!?JB!?_2!?_7<(_7<(_2 (JB (JB!?_2!?JB!?_2 (JG<(JB!?JB!?_2 (JB!?JB!?JB (JB (_2 (JG<(JB!?JG=?JB (JB!?JB (JB (_2!?_7<(_2!?_2 (_2 (_2!?_7<(JG<(_2 (JB (JB!?JB (_7<(JB (_2!?JB (_2 (JB (JB (JB!?_2 (JG<(_7=?JB!?JB!?JG<(JB!?JG<(_7<(JB!?_2!?JG=?JB (JG=?JB!?_2 (JB!?JB (_2 (JB (JB!?JG<(_2!?JB!?_2 (_2!?JG=?JB (JG<(_2 (JB!?JG<(_2!?_2 (_2!?JB!?JB (_7=?JB (JB!?_2 (_2!?_7<(JG<(JB!?JG=?JG<(_2 (JB (_7<(JB (JB!?JG<(JG=?JB (JB (JG<(JB (JB (JB (_2!?_2!?JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JE$4MCP4VR (JB (JB (JB (JB (JB (JCQQ7RQQMB (JB (JB (JB (JB (JM7]7]7]7]7]7]5:H944MCP4_2 (JB (JB (JB (JCP4MCP4MCP4MCP4MCP4MB FA"!?JK^4-K:>8+6=/[6=&9.[/[6=/[5:-K\(MKR4-KR4-KS]7]7]7]5P/[6=/Y.=^KJ]A XFMB!?JB (JB (MCP4MCP4MCP4MCP4MCP4MCP4JB (JB (_-7]TI.=&;6[&;6=&;5P/+Q JG<(JB (JBS]7]7]7]7]7[:>-G)PTBMBP$H(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JDH(JB (_2 (JG<(_2 (JB (_2 (JB!?JB (JB (_2 (_2!?JB (_2!?JB!?_2!?JG<(JB (JB (JB (JB!?JG<(JG<(_7<(JB!?_2!?JG=?JB!?JB (_2 (JB (JB (JG<(JB (JB!?JB (_7=?JG<(JB (_2!?_2!?JB (_2 (JB (JB (JG<(JB!?JG<(_2 (_7=?JB (_2!?JB (_2 (JB!?JG=?_7<(JB (_7<(JG<(JB!?JG<(JB (_2!?JB (JB (JB (_7<(_7<(_2 (JG<(JB (JB (JG=?JB (JB (_7<(JB (_7<(JB (_7<(_7<(_7<(JB (_2 (_2!?JB!?JG<(JG<(JB (JG<(_2 (_7=?JG<(JB (_2!?JG<(JB!?JB (_2 (JG<(JB (JG<(JG=?_2!?JG<(_2 (_7=?JB (_2 (_2 (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!YVU%YVU$(JB (JB (JB (JB (JB (JNY XFA XFC&JB (JB (JB (JB (JB#BTVA XFA XFA XLH(JB (JB (JB (JB (JB (JB!YVU%Y?W4%AOL%_/5YVSP4MCP(JB! TUD%\;:S^+:S$9M:$9NS$9O<?BU JB!QTUEQTUEQTVA XFA XEF>$9NS\?3<MCP4_2 (JB (JB (JE%YVU%YVU%YVU%YVU%YMCP4MB (JB (JFA 7G*S$9NS/)NS$7(#?GMQTWD(JB (JB"\XFA XFA XFAQTRW3/+;\P$IBJB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB!BP" 4JB (JB (JB!YJE%YJE%YJB!YJB (VR (JB (JE$(JB (JE%YJB (VU%YJB (JE$(VR!YVR!YJB!YJB (JB!YJE$(JB (JB!YVR (VR (JB (VR!YJB!YJB!YVU$(JB!YJE%YJE$(VU%YVU$(JB (JB!YVR (VR (VR (JB (VR (VU$(JB!YJB (JB!YJB (JE%YJB!YVR!YVU$(VR (JB!YJB (VR (JB!YJB (VU$(JB (JB!YVR (VR (VU%YVU%YJE$(JE$(JB!YVR!YJB!YVR!YVU%YJE%YVU%YVR (VU%YJB!YJB (JB (JE$(VR (JB!YVU$(JB (JB!YJB!YVR (JB (VR (VR (VR!YVR!YJB!YJB (VU$(VR (JB (VU%YJB (VR (VR (JB (JB (JB!YJE%YJE$(JB!YJE$(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB"7-;^7-;^7-2 (JB (JB (JB (JB (JM>\''K^7-;^7->X(JB (JB (JB (JB (JB (JB (MB#&TRUQIUEQIRT%_\D4MCP4JB (''I2\AGPDTUEQIRT%IUEQIRW\]GPD''B (9)2\''I2\''I2\-;^7-;^7-91=IPPD''B!YJB (JB (JB (JB (JB (JB (JB (JB (MCP4MCP(JB (JO67_UD%TRT%IUEQTRW\]GQ4TY3&JB (JB (V[^7-;^7-;^7-92\_UD%''DIBP" (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (''DHFJCP(JB (MB (JCP4MB (MB 4MCP4MCP4JCP4JB (JB (MCP(JB (JCP4JB (JCP(MB 4MCP4JB (MCP(JB (MB (MB (JB (JB (JCP(JB 4JB 4JB (MB (JB (JCP4JB (JB 4JB (MB 4MB (MCP(MB (MCP4JCP4JB (MCP4MB (JB (MB (MB 4MB (JB 4JB (JCP4JCP4JB (JB (JB 4MB (JCP4MCP4MB (JB 4JB (MCP(MB (MCP4MB (JB (JB (JB (JCP(MB (MB 4JB 4MB (JB (MCP(JB (JCP4JB 4JCP(JB (MCP4JB 4JB (MB (JB (JB (JCP(JCP(MB (JB (MCP(JB 4JB (MCP(MCP(JB (MB (JCP(MCP(MB (JB (JCP4MB (MB (JCP(JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB 4MCP4JB (JB (JB (JB (JB (JB!B9.[&0TIB9.XFJB (JB (JB (JB (JB (JDK&9.[&P#P(JB (JB (JB (JB (JB (JB (JB#A0\F\0\GA0\GA0TIB0R (MB (MN[&0TKH2DKA0\GAP,GA0TJ\P$IBP,D4JB#&9.[&9.[&9.[&9.[&9.[&9.[&9" (JB (JB (JB (JB (JCP4MCP4MCP4MCP4JB (JB 4JB (JB#&9,EB0TIBP,GA0\F\2DIBP$IB9" (JB (JB (9.[&9.[&9.[&0\F\P$IBP$IBJB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (JB (J@@a'))
</methods> <methods> VisualWorks.InstallerMainApplication class <category>interface specs</category>
windowSpec "Tools.UIPainter new openOnClass: self andSelector: #windowSpec" <resource: #canvas> ^#(#{UI.FullSpec} #window: #(#{UI.WindowSpec} #label: #(#{Kernel.UserMessage} #key: #CincomSmalltalkInstaller #defaultString: 'Cincom Smalltalk Installer' #catalogID: #installer ) #min: #(#{Core.Point} 640 450 ) #max: #(#{Core.Point} 1024 750 ) #bounds: #(#{Graphics.Rectangle} 809 347 1449 797 ) #isEventDriven: true ) #component: #(#{UI.SpecCollection} #collection: #( #(#{UI.ActionButtonSpec} #properties: #(#{UI.PropertyListDictionary} #labelFromApplication false ) #layout: #(#{Graphics.LayoutFrame} -179 1 -40 1 -100 1 -10 1 ) #name: #defaultButton #model: #defaultButtonAction #label: '#default' #isDefault: true #defaultable: true ) #(#{UI.ArbitraryComponentSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 0 0 0 1 70 0 ) #name: #defaultBanner #flags: 0 #isOpaque: true #colors: #(#{UI.LookPreferences} #setForegroundColor: #(#{Graphics.ColorValue} #white ) #setBackgroundColor: #(#{Graphics.ColorValue} #white ) #setSelectionForegroundColor: #(#{Graphics.ColorValue} #white ) #setSelectionBackgroundColor: #(#{Graphics.ColorValue} #white ) ) #component: #defaultBanner ) #(#{UI.SubCanvasSpec} #layout: #(#{Graphics.LayoutFrame} 10 0 80 0 -10 1 -60 1 ) #name: #subcanvas #flags: 0 ) #(#{UI.DividerSpec} #layout: #(#{Graphics.LayoutFrame} 10 0 -51 1 -10 1 -49 1 ) #name: #divider ) #(#{UI.ActionButtonSpec} #layout: #(#{Graphics.LayoutFrame} -260 1 -40 1 -181 1 -10 1 ) #name: #previous #flags: 40 #model: #previous #label: #(#{Kernel.UserMessage} #key: #ltBackLabel #defaultString: '< Back' #catalogID: #installer ) ) #(#{UI.ActionButtonSpec} #layout: #(#{Graphics.LayoutFrame} -90 1 -40 1 -10 1 -10 1 ) #name: #cancel #model: #cancel #label: #(#{Kernel.UserMessage} #key: #cancelLabel #defaultString: 'Cancel' #catalogID: #installer ) ) ) ) )
</methods> <methods> VisualWorks.SeedSelectorPage class <category>interface specs</category>
subcanvasSpec "Tools.UIPainter new openOnClass: self andSelector: #subcanvasSpec" <resource: #canvas> ^#(#{UI.FullSpec} #window: #(#{UI.WindowSpec} #label: #(#{Kernel.UserMessage} #key: #SeedSelectorPage #defaultString: 'SeedSelectorPage' #catalogID: #installer ) #bounds: #(#{Graphics.Rectangle} 1215 350 1835 660 ) #isEventDriven: true ) #component: #(#{UI.SpecCollection} #collection: #( #(#{UI.InputFieldSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 0 0 0 1 25 0 ) #name: #pageTitle #flags: 0 #model: #pageTitle #tabable: false #isReadOnly: true #type: #text ) #(#{UI.TextEditorSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 30 0 0 1 -140 1 ) #name: #text #flags: 4 #model: #text #tabable: false #style: #system #isReadOnly: true #tabRequiresControl: false ) #(#{UI.ComboBoxSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 -130 1 -100 1 -105 1 ) #name: #seedFile #model: #seedFile #type: #object #comboList: #seedFiles #readSelector: #readSeedFileFromString: #printSelector: #printSeedFile: ) #(#{UI.ActionButtonSpec} #layout: #(#{Graphics.LayoutFrame} -90 1 -130 1 0 1 -105 1 ) #name: #getOtherSeedLocation #model: #getOtherSeedLocation #label: #(#{Kernel.UserMessage} #key: #otherEllipsis #defaultString: 'Other...' #catalogID: #installer ) #defaultable: true ) #(#{UI.TextEditorSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 -105 1 -100 1 0 1 ) #name: #location #flags: 4 #model: #location #tabable: false #style: #system #isReadOnly: true #tabRequiresControl: false ) ) ) )
</methods> <methods> VisualWorks.ActionSelectorPage class <category>interface specs</category>
subcanvasSpec "Tools.UIPainter new openOnClass: self andSelector: #subcanvasSpec" <resource: #canvas> ^#(#{UI.FullSpec} #window: #(#{UI.WindowSpec} #label: #(#{Kernel.UserMessage} #key: #ActionSelectorPage #defaultString: 'ActionSelectorPage' #catalogID: #installer ) #bounds: #(#{Graphics.Rectangle} 1172 265 1792 575 ) #isEventDriven: true ) #component: #(#{UI.SpecCollection} #collection: #( #(#{UI.InputFieldSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 0 0 0 1 25 0 ) #name: #pageTitle #flags: 0 #model: #pageTitle #tabable: false #isReadOnly: true #type: #text ) #(#{UI.TextEditorSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 25 0 0 1 0 0.25 ) #name: #text #flags: 4 #model: #text #tabable: false #style: #system #isReadOnly: true #tabRequiresControl: false ) #(#{UI.RadioButtonSpec} #layout: #(#{Graphics.LayoutOrigin} 5 0 10 0.25 ) #name: #express #model: #installAction #label: #(#{Kernel.UserMessage} #key: #TypicalInstall #defaultString: 'Typical Install' #catalogID: #installer ) #select: #express ) #(#{UI.TextEditorSpec} #layout: #(#{Graphics.LayoutFrame} 18 0 36 0.25 0 1 0 0.5 ) #name: #typicalText #flags: 4 #model: #typicalText #tabable: false #style: #system #isReadOnly: true #tabRequiresControl: false ) #(#{UI.RadioButtonSpec} #layout: #(#{Graphics.LayoutOrigin} 5 0 10 0.5 ) #name: #custom #model: #installAction #label: #(#{Kernel.UserMessage} #key: #CustomInstall #defaultString: 'Custom Install' #catalogID: #installer ) #select: #custom ) #(#{UI.TextEditorSpec} #layout: #(#{Graphics.LayoutFrame} 18 0 36 0.5 0 1 0 0.75 ) #name: #customText #flags: 4 #model: #customText #tabable: false #style: #system #isReadOnly: true #tabRequiresControl: false ) #(#{UI.RadioButtonSpec} #layout: #(#{Graphics.LayoutOrigin} 5 0 10 0.75 ) #name: #uninstall #model: #installAction #label: #(#{Kernel.UserMessage} #key: #Uninstall #defaultString: 'Uninstall' #catalogID: #installer ) #select: #uninstall ) #(#{UI.TextEditorSpec} #layout: #(#{Graphics.LayoutFrame} 18 0 36 0.75 0 1 0 1 ) #name: #uninstallText #flags: 4 #model: #uninstallText #tabable: false #style: #system #isReadOnly: true #tabRequiresControl: false ) ) ) )
</methods> <methods> Tools.VisualLauncher <category>actions</category>
packageInstallerArchiveForMacOSX <menuItem: #(#MacOSX #installer 'MacOSX') nameKey: nil menu: #(#menuBar #tools #packaging) position: 20.6> Processor activeProcess environmentAt: #WindowManagerUsagePolicy put: MakeNewWindowManagerUsagePolicy new. self applicationForClassNamed: #{VisualWorks.InstallerPackagerUnix} do: [:class | class new packageArchiveForMacOSX]
packageInstallerArchiveForMacOSX_X11 <menuItem: #(#MacOSXX11 #installer 'MacOSX X11') nameKey: nil menu: #(#menuBar #tools #packaging) position: 20.7> Processor activeProcess environmentAt: #WindowManagerUsagePolicy put: MakeNewWindowManagerUsagePolicy new. self applicationForClassNamed: #{VisualWorks.InstallerPackagerUnix} do: [:class | class new packageArchiveForMacOSX_X11]
packageInstallerArchiveForPowermac <menuItem: #(#Powermac #installer 'Powermac') nameKey: nil menu: #(#menuBar #tools #packaging) position: 10.2> Processor activeProcess environmentAt: #WindowManagerUsagePolicy put: MakeNewWindowManagerUsagePolicy new. self applicationForClassNamed: #{VisualWorks.InstallerPackagerPowermac} do: [:class | class new packageArchiveForPowermac]
packageInstallerExecutableForWindows <menuItem: #(#Windows #installer 'Windows') nameKey: nil menu: #(#menuBar #tools #packaging) position: 10.1> Processor activeProcess environmentAt: #WindowManagerUsagePolicy put: MakeNewWindowManagerUsagePolicy new. self applicationForClassNamed: #{VisualWorks.InstallerPackagerWindows} do: [:class | class new packageSingleExecutableForWindows]
packageSelfExtractingInstallerForAIX <menuItem: #(#AIX #installer 'AIX') nameKey: nil menu: #(#menuBar #tools #packaging) position: 20.0> Processor activeProcess environmentAt: #WindowManagerUsagePolicy put: MakeNewWindowManagerUsagePolicy new. self applicationForClassNamed: #{VisualWorks.InstallerPackagerUnix} do: [:class | class new packageSelfExtractorForAIX]
packageSelfExtractingInstallerForAllUnix <menuItem: #(#AllUnix #installer 'All Unix') nameKey: nil menu: #(#menuBar #tools #packaging) position: 10.3> Processor activeProcess environmentAt: #WindowManagerUsagePolicy put: MakeNewWindowManagerUsagePolicy new. self applicationForClassNamed: #{VisualWorks.InstallerPackagerUnix} do: [:class | class new packageArchivesForAll]
packageSelfExtractingInstallerForHPUX <menuItem: #(#HPUX #installer 'HPUX') nameKey: nil menu: #(#menuBar #tools #packaging) position: 20.1> Processor activeProcess environmentAt: #WindowManagerUsagePolicy put: MakeNewWindowManagerUsagePolicy new. self applicationForClassNamed: #{VisualWorks.InstallerPackagerUnix} do: [:class | class new packageSelfExtractorForHPUX]
packageSelfExtractingInstallerForLinuxPPC <menuItem: #(#LinuxPPC #installer 'Linux PPC') nameKey: nil menu: #(#menuBar #tools #packaging) position: 20.2> Processor activeProcess environmentAt: #WindowManagerUsagePolicy put: MakeNewWindowManagerUsagePolicy new. self applicationForClassNamed: #{VisualWorks.InstallerPackagerUnix} do: [:class | class new packageSelfExtractorForLinuxPPC]
packageSelfExtractingInstallerForLinuxSPARC <menuItem: #(#LinuxSPARC #installer 'Linux SPARC') nameKey: nil menu: #(#menuBar #tools #packaging) position: 20.3> Processor activeProcess environmentAt: #WindowManagerUsagePolicy put: MakeNewWindowManagerUsagePolicy new. self applicationForClassNamed: #{VisualWorks.InstallerPackagerUnix} do: [:class | class new packageSelfExtractorForLinuxSPARC]
packageSelfExtractingInstallerForLinuxX86 <menuItem: #(#LinuxX86 #installer 'Linux x86') nameKey: nil menu: #(#menuBar #tools #packaging) position: 20.4> Processor activeProcess environmentAt: #WindowManagerUsagePolicy put: MakeNewWindowManagerUsagePolicy new. self applicationForClassNamed: #{VisualWorks.InstallerPackagerUnix} do: [:class | class new packageSelfExtractorForLinuxX86]
packageSelfExtractingInstallerForLinuxX86_64_64bit <menuItem: #(#LinuxX866464bit #installer 'Linux x86-64 64-bit') nameKey: nil menu: #(#menuBar #tools #packaging) position: 20.5> Processor activeProcess environmentAt: #WindowManagerUsagePolicy put: MakeNewWindowManagerUsagePolicy new. self applicationForClassNamed: #{VisualWorks.InstallerPackagerUnix} do: [:class | class new packageSelfExtractorForLinuxX86_64_64bit]
packageSelfExtractingInstallerForSGI <menuItem: #(#SGI #installer 'SGI') nameKey: nil menu: #(#menuBar #tools #packaging) position: 20.8> Processor activeProcess environmentAt: #WindowManagerUsagePolicy put: MakeNewWindowManagerUsagePolicy new. self applicationForClassNamed: #{VisualWorks.InstallerPackagerUnix} do: [:class | class new packageSelfExtractorForSGI]
packageSelfExtractingInstallerForSolaris <menuItem: #(#Solaris #installer 'Solaris') nameKey: nil menu: #(#menuBar #tools #packaging) position: 20.9> Processor activeProcess environmentAt: #WindowManagerUsagePolicy put: MakeNewWindowManagerUsagePolicy new. self applicationForClassNamed: #{VisualWorks.InstallerPackagerUnix} do: [:class | class new packageSelfExtractorForSolaris]
stripInstallImage <menuItem: #(#StripInstallImage #installer 'Strip Install Image') nameKey: nil menu: #(#menuBar #tools) position: 21.534> Processor activeProcess environmentAt: #WindowManagerUsagePolicy put: MakeNewWindowManagerUsagePolicy new. self applicationForClassNamed: #{VisualWorks.InstallImageStripper} do: [:class | class stripInstallImage: nil]
toolsPackagingSubmenu <submenu: #(#PackageInstallerFor #installer 'Package Installer for...') nameKey: #packaging menu: #(#menuBar #tools) position: 21.535>
</methods> "Imported Classes:" self error: 'Attempting to file-in parcel imports. Choose terminate or close' <class> <name>Object</name> <environment>Core</environment> <super></super> <private>false</private> none <imports></imports> <category>Kernel-Objects</category> <attributes> <package>Kernel-Objects</package> </attributes> </class> <class> <name>ApplicationModel</name> <environment>UI</environment> <super>UI.Model</super> <private>false</private> none builder uiSession eventHandlers savedWindowInformation <imports></imports> <category>UIBuilder-Framework</category> <attributes> <package>UIBuilder-Framework</package> </attributes> </class> <class> <name>SimpleDialog</name> <environment>UI</environment> <super>UI.ApplicationModel</super> <private>false</private> none close accept cancel preBuildBlock postBuildBlock postOpenBlock escapeIsCancel parentView <imports></imports> <category>Interface-Dialogs</category> <attributes> <package>Interface-Dialogs</package> </attributes> </class> <class> <name>PolicyDialog</name> <environment>Tools</environment> <super>UI.SimpleDialog</super> <private>false</private> none applyToAll message resultHolder <imports></imports> <category>TAR</category> <attributes> <package>TAR</package> </attributes> </class> <class> <name>OrderedCollection</name> <environment>Core</environment> <super>Core.SequenceableCollection</super> <private>false</private> objects firstIndex lastIndex <imports></imports> <category>Collections-Sequenceable</category> <attributes> <package>Collections-Sequenceable</package> </attributes> </class> <class> <name>VisualLauncher</name> <environment>Tools</environment> <super>UI.ApplicationModel</super> <private>false</private> none menuBar toolBar textCollector toolDock <imports></imports> <category>Tools-Misc</category> <attributes> <package>Tools-Misc</package> </attributes> </class> <class> <name>SAXDriver</name> <environment>XML</environment> <super>Core.Object</super> <private>false</private> none locator <imports></imports> <category>XML-SAX</category> <attributes> <package>XML</package> </attributes> </class>