[commit] r2737 - in trunk/Install: . Build

GMESRC Repository Notifications gme-commit at list.isis.vanderbilt.edu
Mon Feb 5 11:28:23 CST 2018


Author: ksmyth
Date: Mon Feb  5 11:28:23 2018
New Revision: 2737

Log:
WiX bundle installer

Added:
   trunk/Install/GME_bundle.wxs
   trunk/Install/RtfTheme.xml
Modified:
   trunk/Install/Build/build.py
   trunk/Install/Build/tools.py
   trunk/Install/GME.wxs

Modified: trunk/Install/Build/build.py
==============================================================================
--- trunk/Install/Build/build.py	Mon Feb  5 11:28:18 2018	(r2736)
+++ trunk/Install/Build/build.py	Mon Feb  5 11:28:23 2018	(r2737)
@@ -7,7 +7,8 @@
 """GME Build System - central module"""
 
 import sys
-import os, os.path
+import os
+import os.path
 import getopt
 from prefs import prefs
 import tools
@@ -36,43 +37,43 @@
 
 def check_prerequisites():
     "Check prerequisites (required tools, etc.)"
-    
+
     # Test for GME_ROOT environment variable
     if not os.environ['GME_ROOT']:
         print "GME_ROOT environment variable is not set! (It should point to the GMESRC folder)"
         raise
-        
+
     if not os.environ['JAVA_HOME']:
         print "JAVA_HOME environment variable is not set! (It should point to the JDK root folder)"
         raise
-        
+
     if os.path.normpath(os.path.abspath(os.environ['GME_ROOT'])) != GME_ROOT:
         print "GME_ROOT environment variable is not set to the current dev. source tree!"
         print "GME_ROOT =", os.environ['GME_ROOT']
         print "Current dev. source tree:", GME_ROOT
         raise
-    
+
     # Test for Microsoft Visual Studio 2010
     try:
         tools.test_VS()
     except:
         print "Microsoft Visual Studio 2010 is not installed!"
         raise
-    
+
     # Test for zip utility
     try:
         tools.test_zip()
     except:
         print "ZIP utility cannot be found!"
         raise
-    
+
     # Test for InstallShield
     try:
         tools.test_WiX()
     except:
         print "WiX toolset cannot be found in your path!"
         raise
-    
+
     # Test for SVN
     try:
         tools.test_SVN()
@@ -96,8 +97,8 @@
             header.write(text)
     # resource compiler doesn't do dependency tracking well
     #  echo `grep -rlI GME_VERSION GME | grep \\.rc | sed 's/^/"/; s/$/",/'`
-    for filename in ("GME/Console/Console.rc", "GME/ConstraintManager/ConstraintManager.rc", "GME/Core/Core.rc", "GME/Gme/GME.rc", "GME/Gme/res/AboutBox.rc", 
-            "GME/GMEActiveBrowser/GMEActiveBrowser.rc", "GME/Meta/Meta.rc", "GME/Mga/Mga.rc", "GME/MgaUtil/MgaUtil.rc", "GME/ObjectInspector/ObjectInspector.rc", 
+    for filename in ("GME/Console/Console.rc", "GME/ConstraintManager/ConstraintManager.rc", "GME/Core/Core.rc", "GME/Gme/GME.rc", "GME/Gme/res/AboutBox.rc",
+            "GME/GMEActiveBrowser/GMEActiveBrowser.rc", "GME/Meta/Meta.rc", "GME/Mga/Mga.rc", "GME/MgaUtil/MgaUtil.rc", "GME/ObjectInspector/ObjectInspector.rc",
             "GME/PanningView/PanningView.rc", "GME/Parser/Parser.rc", "GME/PartBrowser/PartBrowser.rc", "GME/Search/Search.rc", "GME/XmlBackEnd/XmlBackEnd.rc"):
         os.utime(os.path.join(GME_ROOT, filename), None)
 
@@ -115,7 +116,7 @@
         lines = [line for line in lines if line.find(u'DLLDATA.C') == -1]
     with codecs.open(tlog, 'w', encoding='utf-16-le') as f:
         for line in lines: f.write(line)
-        
+
 def compile_GME():
     "Compile GME core components"
     if prefs['arch'] == 'x64':
@@ -135,7 +136,7 @@
     tools.system( ['call', 'regrelease.bat'] + (['x64'] if prefs['arch'] == 'x64' else []) + ['<NUL'], cmd_dir)
     sln_file = os.path.join(GME_ROOT, "GME", "DotNetPIAs", "DotNetPIAs.vcxproj")
     tools.build_VS( sln_file, "Release" )
-    
+
     for filename in ('policy.1.0.GME.MGA.Core', 'policy.1.0.GME.MGA.Meta', 'policy.1.0.GME.MGA', 'policy.1.0.GME', 'policy.1.0.GME.Util', 'policy.1.0.GME.MGA.Parser'):
         pia_dir = os.path.join(GME_ROOT, "GME", "DotNetPIAs_1.0.1.0")
         config = '%s.config' % filename
@@ -145,7 +146,7 @@
                 '/link:' + config, '/out:' + dll,
                 '/keyfile:..\MgaDotNetServices\MgaDotNetServicesKey.snk', '/platform:anycpu', '/version:1.0.0.0'], pia_dir)
             tools.system([r'C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\gacutil.exe', '/i', dll], pia_dir)
-    
+
 def _Release_PGO_dir():
     if prefs['arch'] == 'x64':
         return os.path.join(GME_ROOT, 'GME', 'x64', 'Release_PGO')
@@ -217,7 +218,7 @@
     cmd_dir = os.path.join(GME_ROOT, "Paradigms", "MetaGME")
     tools.system( ['call', 'regrelease.bat'] + (['x64'] if prefs['arch'] == 'x64' else []) + ['<NUL'], cmd_dir)
 
-        
+
 def compile_JBON():
     "Compile Java component support (JBON)"
     if prefs['arch'] == 'x64': return
@@ -226,22 +227,22 @@
     sln_file = os.path.join(GME_ROOT, "SDK", "Java", "native", "JavaSupport.sln")
     tools.build_VS( sln_file, "Release" )
 
-        
+
 def compile_tools():
     "Compile external tool components"
     import _winreg
-    
+
     # Auto Layout
     sln_file = os.path.join(GME_ROOT, "Tools", "AutoLayout", "AutoLayout.sln")
     tools.build_VS( sln_file, "Release" )
 
     sln_file = os.path.join(GME_ROOT, "SDK", "DotNet", "DsmlGenerator", "DsmlGenerator.sln")
     tools.build_VS(sln_file, "Release", arch='Any CPU', msbuild=(prefs['arch'] == 'x64' and tools.MSBUILD.replace('Framework', 'Framework64') or tools.MSBUILD))
-    
+
     with _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\Microsoft", 0, _winreg.KEY_WOW64_32KEY | _winreg.KEY_WRITE | _winreg.KEY_READ) as ms:
         with _winreg.CreateKey(ms, r".NETFramework\v4.0.30319\AssemblyFoldersEx\ISIS.GME.Common") as key:
             _winreg.SetValueEx(key, None, 0, _winreg.REG_SZ, os.path.join(os.environ['windir'], r"Microsoft.NET\assembly\GAC_MSIL\ISIS.GME.Common\v4.0_1.0.7.0__1321e6b92842fe54"))
-    
+
     sln_file = os.path.join(GME_ROOT, "Tools", "DumpWMF", "DumpWMF.sln")
     tools.build_VS(sln_file, "Release", arch='Any CPU', msbuild=(prefs['arch'] == 'x64' and tools.MSBUILD.replace('Framework', 'Framework64') or tools.MSBUILD))
 
@@ -258,7 +259,7 @@
     # Table Editor
     sln_file = os.path.join(GME_ROOT, "Tools", "TableEditor", "TableEditor.sln")
     tools.build_VS( sln_file, "Release" )
-    
+
     # GMEplink
     sln_file = os.path.join(GME_ROOT, "Tools", "GMEplink", "GMEplink.sln")
     tools.build_VS( sln_file, "Release" )
@@ -268,7 +269,7 @@
 
 def compile_samples():
     "Compile sample components"
-    
+
     # UML Paradigm
     sln_file = os.path.join(GME_ROOT, "Paradigms", "UML", "decorator", "UMLDecorator.sln")
     tools.build_VS( sln_file, "Release" )
@@ -277,7 +278,7 @@
 
     sln_file = os.path.join(GME_ROOT, "SDK", "PatternProcessor", "PatternProcessor.sln")
     tools.build_VS( sln_file, "Release" )
-    
+
     # SF Paradigm
     sln_file = os.path.join(GME_ROOT, "Paradigms", "SF", "SFInterpreter", "SFInterpreter.sln")
     tools.build_VS( sln_file, "Release" )
@@ -285,11 +286,11 @@
     tools.build_VS( sln_file, "Release" )
     sln_file = os.path.join(GME_ROOT, "Paradigms", "SF", "BON2SFInterpreter", "BON2SFInterpreter.sln")
     tools.build_VS( sln_file, "Release" )
-    
+
     # HFSM Paradigm
     sln_file = os.path.join(GME_ROOT, "Paradigms", "HFSM", "HFSMSimulator", "HFSMSimulator.sln")
     tools.build_VS( sln_file, "Release" )
-    
+
 
 def zip_decorsamples():
     "Create PlainDecoratorSample.zip"
@@ -317,23 +318,23 @@
 def generate_sample_files():
     "Generate sample files (mta/mga)"
     samples_root = os.path.join(GME_ROOT, "Paradigms")
-    
+
     # SF Paradigm
     sample_file = os.path.join(samples_root, "SF", "SFMeta.xme")
     tools.xme2mga(sample_file, "MetaGME")
-    tools.xmp2mta(SF_XMP, "SF") 
+    tools.xmp2mta(SF_XMP, "SF")
     sample_file = os.path.join(samples_root, "SF", "SFDemo.xme")
     tools.xme2mga(sample_file, "SF")
 
     # HFSM Paradigm
     sample_file = os.path.join(samples_root, "HFSM", "HFSM-Meta.xme")
     tools.xme2mga(sample_file, "MetaGME")
-    tools.xmp2mta(HFSM_XMP, "HFSM") 
+    tools.xmp2mta(HFSM_XMP, "HFSM")
     sample_file = os.path.join(samples_root, "HFSM", "HFSM-Demo01.xme")
     tools.xme2mga(sample_file, "HFSM")
     sample_file = os.path.join(samples_root, "HFSM", "HFSM-Demo02.xme")
     tools.xme2mga(sample_file, "HFSM")
-    
+
     # UML Paradigm
     sample_file = os.path.join(samples_root, "UML", "UMLMeta.xme")
     tools.xme2mga(sample_file, "MetaGME")
@@ -348,12 +349,12 @@
         "-Verbosity", "detailed",
         "-BasePath", dsml_generator,
         "-OutputDirectory", os.path.join(GME_ROOT, "Install")])
-        
+
     tools.system([nuget, "pack", os.path.join(dsml_generator, "GME.DSMLGenerator.Runtime.nuspec"),
         "-Verbosity", "detailed",
         "-BasePath", dsml_generator,
         "-OutputDirectory", os.path.join(GME_ROOT, "Install")])
-        
+
     dotnet_pias = os.path.join(GME_ROOT, "GME", "DotNetPIAs")
     tools.system([nuget, "pack", os.path.join(dotnet_pias, "GME.PIAs.nuspec"),
         "-Verbosity", "detailed",
@@ -364,7 +365,7 @@
     """Build WiX libraries (wixlibs files)
     (Still called build_msms, for historical reasons)
     """
-    
+
     # Prepare include file with dynamic data
     f = open(os.path.join(GME_ROOT, "Install", "GME_dyn.wxi"), 'w')
     print >> f, "<!-- DO NOT EDIT THIS FILE. WILL BE REGENERATED BY THE BUILD SCRIPTS -->"
@@ -373,11 +374,11 @@
     print >> f, "   <?define GUIDSTRHFSM='%s' ?>" % (tools.query_GUID(mta_for_xmp(HFSM_XMP)))
     print >> f, "   <?define GUIDSTRSF='%s' ?>" % (tools.query_GUID(mta_for_xmp(SF_XMP)))
     print >> f, "   <?define GUIDSTRUML='%s' ?>" % (tools.query_GUID(mta_for_xmp(UML_XMP)))
-    print >> f, "</Include>" 
+    print >> f, "</Include>"
     f.close()
-   
+
     import glob
-    sources = [f for f in glob.glob(os.path.join(GME_ROOT, "Install", "*.wxs")) if f.find('GME.wxs') == -1 ]
+    sources = [f for f in glob.glob(os.path.join(GME_ROOT, "Install", "*.wxs")) if os.path.basename(f) not in ('GME.wxs', 'GME_bundle.wxs')]
     if prefs['arch'] == 'x64':
         sources.remove(os.path.join(GME_ROOT, "Install", "GME_SDK.wxs"))
         sources.remove(os.path.join(GME_ROOT, "Install", "GME_paradigms.wxs"))
@@ -387,19 +388,23 @@
             extras = glob.glob(os.path.join(GME_ROOT, "Install", "PIA*/*.wxi"))
         tools.build_WiX([file_] + extras)
 
+
 def build_msi():
-    "Build WiX installer (msi file)"
+    """Build WiX installer (msi file)."""
+    # tools.build_WiX([os.path.join(GME_ROOT, "Install", "GME.wxs")])
+
+    if prefs['arch'] == 'x64':
+        tools.download_bundle_deps(os.path.join(GME_ROOT, "Install", "GME_bundle.wxs"), [os.path.join(GME_ROOT, "Install", "GME_inc.wxi"), os.path.join(GME_ROOT, "Install", "GME_bundle.wxs")])
+        tools.system([os.path.join(tools._get_wix_path(), 'candle.exe'), "GME_bundle.wxs"] + '-ext WixBalExtension -ext WixUtilExtension -ext WixDependencyExtension'.split() + ['-dVERSIONSTR=' + prefs['version_string']], os.path.join(GME_ROOT, "Install"))
+        tools.system([os.path.join(tools._get_wix_path(), 'light.exe'), "GME_bundle.wixobj"] + '-ext WixBalExtension -ext WixUtilExtension -ext WixDependencyExtension -ext WixNetFxExtension'.split(), os.path.join(GME_ROOT, "Install"))
 
-    # Build the msi file
-    tools.build_WiX([os.path.join(GME_ROOT, "Install", "GME.wxs")])
-   
 
 def zip_pdb():
     "Collect and zip all debug information (*.pdb)"
     tools.system(r"call install\symbols_source_server.cmd <NUL".split(), GME_ROOT)
     zipname = os.path.join(GME_ROOT, "Install", "GME-" + prefs['version_string'] + "-symbols.zip")
     tools.collect_and_zip(GME_ROOT, zipname, "*.pdb *.dll *.exe *.ocx")
-    pass
+
 
 def publish():
     "Publish and archive the install image and debug info"
@@ -428,11 +433,11 @@
     compile_meta,
     compile_JBON,
     compile_tools,
-    compile_samples, 
-    zip_decorsamples, 
-    zip_scriptSDK, 
+    compile_samples,
+    zip_decorsamples,
+    zip_scriptSDK,
     generate_meta_files,
-    generate_sample_files, 
+    generate_sample_files,
     compile_GME_PGO_Instrument,
     PGO_train,
     compile_GME_PGO_Optimize,
@@ -462,7 +467,7 @@
   -V, --version=MAJOR.MINOR.PATCHLEVEL.BUILD
                       set version (default: %d.%d.%d.%d)
   -b, --build_version=BUILD
-                      set only the build version  
+                      set only the build version
 
   -a, --arch=ARCH     set architecture (x64 or x86)
 \tBuild steps:
@@ -525,12 +530,12 @@
             prefs["version_build"] = int(b)
         if opt in ("-a", "--arch"):
             prefs["arch"] = val
-            
+
 except (getopt.GetoptError, ValueError, AttributeError), e:
     print e
     print usage
     sys.exit(2)
-    
+
 prefs["version_string"] = ".".join([str(prefs["version_major"]),
                                    str(prefs["version_minor"]),
                                    str(prefs["version_patch"])] +

Modified: trunk/Install/Build/tools.py
==============================================================================
--- trunk/Install/Build/tools.py	Mon Feb  5 11:28:18 2018	(r2736)
+++ trunk/Install/Build/tools.py	Mon Feb  5 11:28:23 2018	(r2737)
@@ -57,8 +57,8 @@
 def test_zip():
     "Test for ZIP utility. Raises exception if not found."
     system([ZIP_PRG, '>NUL'])
-    
-    
+
+
 def zip(dirname, zipname, list=None):
     """
     Build zip archive in the specified directory.
@@ -74,7 +74,7 @@
         cmd_line.append("-i@" + list)
     cmd_line.extend([zipname, '.', '>NUL'])
     system(cmd_line, dirname)
-    
+
 def collect_and_zip(dirname, zipname, pattern=None):
     """
     Collect files (recursively) and build zip archive in the specified directory.
@@ -129,7 +129,7 @@
     import subprocess
     # , '/fl', '/flp:Verbosity=diagnostic'
     # , '/m'
-    args = [msbuild, sln_path, '/m', '/t:' + target, 
+    args = [msbuild, sln_path, '/m', '/t:' + target,
          '/p:VisualStudioVersion=%s.0;PlatformToolset=v%s0;Configuration=%s' % (prefs['toolset'], prefs['toolset'], config_name) +
         (';Platform=x64' if arch == 'x64' else '') ]
     with open(os.devnull, "w") as nulfp:
@@ -141,9 +141,9 @@
     """
     Generates an .mga file from an .xme file
     params
-        xml_file    : full path to the xme file 
+        xml_file    : full path to the xme file
         paradigm    : use the specified paradigm to parse the project
-        
+
     The generated .mga file will be created with the same name/path but different
     extension.
     """
@@ -153,16 +153,16 @@
     mga_file = os.path.splitext(xml_file)[0] + ".mga"
     project.Create( "MGA="+mga_file, paradigm )
     parser.ParseProject( project, xml_file )
-    project.Close()    
+    project.Close()
+
 
-    
 def xmp2mta(xml_file, paradigm):
     """
     Generates and registers (system-wide) an .mta file from an .xmp file
     params
-        xml_file    : full path to the xmp file 
+        xml_file    : full path to the xmp file
         paradigm    : use the specified paradigm name to parse the paradigm file
-        
+
     The generated .mta file will be created with the same name/path but different
     extension.
     """
@@ -179,9 +179,9 @@
     Queries the current GUID of the specified paradigm.
     params
         paradigm    : the name of the paradigm to be queried
-    
+
     returns the GUID as a string
-    """ 
+    """
     metaproject = Dispatch("MGA.MgaMetaProject")
     metaproject.Open('MGA=' + mta_file)
     try:
@@ -193,19 +193,21 @@
 
 def _get_wix_path():
     import _winreg
-    for wix_ver in ('3.11', '3.10', '3.9', '3.8', '3.7', '3.6', '3.5'):
+    wix_vers = ('3.11', '3.10')
+    for wix_ver in wix_vers:
         try:
-            with _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, 'SOFTWARE\\Microsoft\\Windows Installer XML\\' + wix_ver) as wixkey:
+            with _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, 'SOFTWARE\\Microsoft\\Windows Installer XML\\' + wix_ver, 0, _winreg.KEY_READ | _winreg.KEY_WOW64_32KEY) as wixkey:
                 return _winreg.QueryValueEx(wixkey, 'InstallRoot')[0]
         except Exception as e:
             pass
-        
+    raise ValueError('Could not find WiX {}'.format(' or '.join(wix_vers)))
+
 def test_WiX():
     "Test for WiX. Raises exception if not found."
     toolmsg("Trying to execute WiX tool candle.exe")
     exepath = os.path.join(_get_wix_path(), WIX_CANDLE_PRG)
     system([exepath])
-    
+
 
 def _x64_suffix(str):
     return str + '_x64' if prefs['arch'] == 'x64' else str
@@ -228,10 +230,10 @@
     toolmsg("Building " + filename + " in " + dirname)
     wxi_files = filter(lambda file: file.find(".wxi") != -1, wix_files)
     mm_files = filter(lambda file: file.find(".wxs") != -1, wix_files)
-    
+
     for file in wix_files:
         _candle(file)
-    
+
     for wxs in mm_files:
         if wxs.find('GME.wxs') == -1:
             exepath = os.path.join(_get_wix_path(), 'lit.exe')
@@ -245,3 +247,88 @@
                 wixlibs += ['GME_bin_x64.wixlib']
         cmd_line = [exepath] + ['-o', _x64_suffix(os.path.splitext(wxs)[0]) + ext] + [ _get_wixobj(file) for file in wxi_files ] + [ _get_wixobj(wxs)] + wixlibs
         system(cmd_line, dirname)
+
+
+import errno
+import requests
+import tempfile
+import hashlib
+import itertools
+from xml.etree import ElementTree
+import xml.sax
+from xml.sax.handler import ContentHandler
+
+
+def download_file(url, filename):
+    if os.path.isfile(filename):
+        return
+    print('Downloading {} => {}'.format(url, filename))
+    if os.path.dirname(filename):
+        try:
+            os.makedirs(os.path.dirname(filename))
+        except OSError as e:
+            if e.errno != errno.EEXIST:
+                raise
+    r = requests.get(url, stream=True)
+    r.raise_for_status()
+    fd, tmp_path = tempfile.mkstemp()
+    # wix bootstrapper uses SHA1
+    hash = hashlib.sha1()
+    with os.fdopen(fd, 'wb') as f:
+        for chunk in r.iter_content(chunk_size=1024):
+            if chunk:  # filter out keep-alive new chunks
+                hash.update(chunk)
+                f.write(chunk)
+        # n.b. don't use f.tell(), since it will be wrong for Content-Encoding: gzip
+        downloaded_octets = r.raw._fp_bytes_read
+    if int(r.headers.get('content-length', downloaded_octets)) != downloaded_octets:
+        os.unlink(tmp_path)
+        raise ValueError('Download of {} was truncated: {}/{} bytes'.format(url, downloaded_octets, r.headers['content-length']))
+    else:
+        os.rename(tmp_path, filename)
+        print('  => {} {}'.format(filename, hash.hexdigest()))
+
+
+class WixProcessingInstructionHandler(ContentHandler):
+    def __init__(self):
+        ContentHandler.__init__(self)
+        self.defines = {}
+
+    def processingInstruction(self, target, data):
+        if target == 'define':
+            eval(compile(data, '<string>', 'exec'), globals(), self.defines)
+        elif target == 'include':
+            pass  # TODO
+
+
+def download_bundle_deps(bundle_wxs, define_files=[]):
+    bundle_dir = os.path.dirname(os.path.abspath(bundle_wxs))
+    downloaded_files = []
+    defines = WixProcessingInstructionHandler()
+    for define_file in define_files:
+        assert os.path.isfile(define_file)
+        print(define_file)
+        xml.sax.parse(define_file, defines)
+
+    def eval_vars(attr):
+        for name, val in defines.defines.iteritems():
+            attr = attr.replace('$(var.{})'.format(name), val)
+        return attr
+
+    tree = ElementTree.parse(bundle_wxs).getroot()
+    ElementTree.register_namespace("", "http://schemas.microsoft.com/wix/2006/wi")
+
+    for package in itertools.chain(tree.findall(".//{http://schemas.microsoft.com/wix/2006/wi}ExePackage"),
+            tree.findall(".//{http://schemas.microsoft.com/wix/2006/wi}MsuPackage"),
+            tree.findall(".//{http://schemas.microsoft.com/wix/2006/wi}MsiPackage")):
+        url = eval_vars(package.get('DownloadUrl', ''))
+        if not url:
+            continue
+        filename = os.path.join(bundle_dir, eval_vars(package.get('SourceFile', '') or package.get('Name', '')))
+        download_file(url, filename)
+        downloaded_files.append(filename)
+    # from https://github.com/wixtoolset/wix3/blob/develop/src/ext/NetFxExtension/wixlib/NetFx4.5.wxs
+    # filename = 'redist\\dotNetFx45_Full_setup.exe'
+    # download_file('http://go.microsoft.com/fwlink/?LinkId=225704', filename)
+    # downloaded_files.append(filename)
+    return downloaded_files

Modified: trunk/Install/GME.wxs
==============================================================================
--- trunk/Install/GME.wxs	Mon Feb  5 11:28:18 2018	(r2736)
+++ trunk/Install/GME.wxs	Mon Feb  5 11:28:23 2018	(r2737)
@@ -97,6 +97,24 @@
       <![CDATA[Installed OR (VersionNT >= 501)]]>
     </Condition>
 
+    <Property Id="UCRTINSTALLED">
+      <DirectorySearch Id="UCRTSystemSearch" Path="[SystemFolder]" Depth="0">
+        <FileSearch Id="UCRTFileSearch" Name="ucrtbase.dll"/>
+      </DirectorySearch>
+    </Property>
+    <Condition Message="This application requires the Universal CRT. Please install KB2999226 via Windows Update or https://support.microsoft.com/en-us/kb/2999226">
+      <![CDATA[Installed OR UCRTINSTALLED]]>
+    </Condition>
+
+    <Property Id="MSVCPINSTALLED">
+      <DirectorySearch Id="MSVCPSystemSearch" Path="[SystemFolder]" Depth="0">
+        <FileSearch Id="MSVCPFileSearch" Name="msvcp140.dll"/>
+      </DirectorySearch>
+    </Property>
+    <Condition Message="This application requires Visual C++ Redistributable for Visual Studio 2015">
+      <![CDATA[Installed OR MSVCPINSTALLED]]>
+    </Condition>
+
     <Property Id='ARPPRODUCTICON' Value='GME.ico' />
 
     <Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT" Value="Launch GME" />
@@ -300,20 +318,14 @@
       <?endif?>
     </Directory>
 
-    <!-- =========================================================== -->
-    <!-- MERGE MODULES -->
-    <!-- =========================================================== -->
     <DirectoryRef Id='TARGETDIR'>
       <?if $(sys.BUILDARCH)=x86 ?>
       <?endif?>
+      <!-- needed for CrashRpt.dll on x86, x64; for libapr-1.dll, libeay32.dll, et al on x86 -->
       <Merge Id="CRT100" Language="0" SourceFile="$(env.ProgramFiles)\Common Files\Merge Modules\Microsoft_VC100_CRT_$(sys.BUILDARCH).msm" DiskId="1" />
-      <Merge Id="MFC100" Language="0" SourceFile="$(env.ProgramFiles)\Common Files\Merge Modules\Microsoft_VC100_MFC_$(sys.BUILDARCH).msm" DiskId="1" />
-      <Merge Id="ATL100" Language="0" SourceFile="$(env.ProgramFiles)\Common Files\Merge Modules\Microsoft_VC100_ATL_$(sys.BUILDARCH).msm" DiskId="1" />
 
       <?if $(sys.BUILDARCH)=x64 ?>
       <Merge Id="CRT100_x86" Language="0" SourceFile="$(env.ProgramFiles)\Common Files\Merge Modules\Microsoft_VC100_CRT_x86.msm" DiskId="1" />
-      <Merge Id="MFC100_x86" Language="0" SourceFile="$(env.ProgramFiles)\Common Files\Merge Modules\Microsoft_VC100_MFC_x86.msm" DiskId="1" />
-      <Merge Id="ATL100_x86" Language="0" SourceFile="$(env.ProgramFiles)\Common Files\Merge Modules\Microsoft_VC100_ATL_x86.msm" DiskId="1" />
       <?endif?>
     </DirectoryRef>
 
@@ -331,16 +343,12 @@
         <?if $(sys.BUILDARCH)=x64 ?>
         <ComponentGroupRef Id='GME_binx64' />
         <MergeRef Id='CRT100_x86' />
-        <MergeRef Id='MFC100_x86' />
-        <MergeRef Id='ATL100_x86' />
         <?endif?>
 
         <?if $(sys.BUILDARCH)=x86 ?>
         <?endif?>
 
         <MergeRef Id='CRT100' />
-        <MergeRef Id='MFC100' />
-        <MergeRef Id='ATL100' />
       </Feature>
 
       <Feature Id='Samples' Title='Samples' Description='These are sample paradigms and interpreters with source code'

Added: trunk/Install/GME_bundle.wxs
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ trunk/Install/GME_bundle.wxs	Mon Feb  5 11:28:23 2018	(r2737)
@@ -0,0 +1,192 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<?define ProviderKey="{17CDE67A-A87A-4B71-B91B-75606E3AC99E}" ?>
+<?define BundleUpgradeCode="{B6ABF941-4DF8-4A63-88F5-87F76AC3F728}" ?>
+<?define CompanyName="Vanderbilt University, ISIS" ?>
+<?define UpdateURL="https://forge.isis.vanderbilt.edu/gme/" ?>
+<?define InstallerVersion="500" ?>
+<?define Compressed="no" ?>
+<?define Vc9RedistVersion="v9.0.30729.4148" ?>
+<?define VcRedistVersion="v14.0.24123" ?>
+
+<?include GME_inc.wxi ?>
+
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
+     xmlns:bal="http://schemas.microsoft.com/wix/BalExtension"
+     xmlns:dep='http://schemas.microsoft.com/wix/DependencyExtension'
+     xmlns:util='http://schemas.microsoft.com/wix/UtilExtension'
+     xmlns:netfx='http://schemas.microsoft.com/wix/NetFxExtension'
+>
+    <Bundle Name="$(var.ProductName) $(var.VERSIONSTR)"
+            IconSourceFile="../GME/Gme/res/GME.ico"
+            Version="$(var.VERSIONSTR)"
+            Manufacturer="$(var.CompanyName)"
+            dep:ProviderKey="$(var.ProviderKey)"
+            UpgradeCode="$(var.BundleUpgradeCode)"
+            UpdateUrl="$(var.UpdateURL)"
+            DisableModify="yes"
+            >
+
+      <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense">
+        <bal:WixStandardBootstrapperApplication
+          LicenseFile="..\Doc\Legal\License.rtf"
+          LogoFile="../SDK/DotNet/CSharpComponentWizard/Images/gmeICON.png"
+          ShowVersion="yes"
+          SuppressOptionsUI="no"
+          SuppressRepair="yes"
+          ThemeFile="RtfTheme.xml"/>
+      </BootstrapperApplicationRef>
+
+    <util:FileSearch Id="SearchSystem"
+                     Path="[SystemFolder]advapi32.dll"
+                     Variable="ADVAPIVERSION"
+                     Result="version"
+                     />
+
+    <util:FileSearch Id="SearchSystem2"
+                     Path="[SystemFolder]ucrtbase.dll"
+                     Variable="UCRTVERSION"
+                     Result="version"
+                     />
+
+      <util:FileSearch Id="SearchSystem3"
+                       Path="[WindowsFolder]System32\ucrtbase.dll"
+                       Variable="UCRTVERSION64"
+                       Result="version"
+                       />
+
+    <util:RegistrySearch Id="vcredist_2015_x86_check" Root="HKLM" Key="SOFTWARE\Microsoft\DevDiv\VC\Servicing\14.0\RuntimeMinimum" Value="Install" Variable="vcredist_2015_x86_installed" Win64="no"/>
+    <util:RegistrySearch Id="vcredist_2015_x86_versioncheck" Root="HKLM" Key="SOFTWARE\Classes\Installer\Dependencies\Microsoft.VS.VC_RuntimeMinimumVSU_x86,v14" Value="Version" Variable="vcredist_2015_x86_version" Result="exists" Win64="no"/>
+    <util:RegistrySearch Id="vcredist_2015_x86_versionnumbercheck" Root="HKLM" Key="SOFTWARE\Classes\Installer\Dependencies\Microsoft.VS.VC_RuntimeMinimumVSU_x86,v14" Value="Version" Variable="vcredist_2015_x86_versionnumber" Result="value" Win64="no"/>
+
+    <util:RegistrySearch Id="vcredist_2015_x64_check" Root="HKLM" Key="SOFTWARE\Microsoft\DevDiv\VC\Servicing\14.0\RuntimeMinimum" Value="Install" Variable="vcredist_2015_x64_installed" Win64="yes"/>
+    <util:RegistrySearch Id="vcredist_2015_x64_versioncheck" Root="HKLM" Key="SOFTWARE\Classes\Installer\Dependencies\Microsoft.VS.VC_RuntimeMinimumVSU_amd64,v14" Value="Version" Variable="vcredist_2015_x64_version" Result="exists" Win64="yes"/>
+    <util:RegistrySearch Id="vcredist_2015_x64_versionnumbercheck" Root="HKLM" Key="SOFTWARE\Classes\Installer\Dependencies\Microsoft.VS.VC_RuntimeMinimumVSU_amd64,v14" Value="Version" Variable="vcredist_2015_x64_versionnumber" Result="value" Win64="yes"/>
+
+    <!-- n.b. this does not work. the x86 package has the same UpgradeCode. If you install x86 first then this bundle, x64 will not be installed -->
+    <!-- <util:ProductSearch Id="vcredist_2008sp1_x64_versioncheck" UpgradeCode="{AA783A14-A7A3-3D33-95F0-9A351D530011}" Result="version" Variable="vcredist_2008sp1_x64_versionnumber"/> -->
+    <!-- uplevel.30729.4148.Microsoft_VC90_CRT_x64.QFE {3FA0170E-227C-37C7-BAC0-64691A992C81} -->
+    <util:ComponentSearch Id="vcredist_2008sp1_x64_msvcr90" Guid="{3FA0170E-227C-37C7-BAC0-64691A992C81}" Result="directory" Variable="vcredist_2008sp1_x64_msvcr90" />
+    <util:FileSearch Id="vcredist_2008sp1_x64_versionnumber" After="vcredist_2008sp1_x64_msvcr90" Condition="vcredist_2008sp1_x64_msvcr90" Path="[vcredist_2008sp1_x64_msvcr90]\msvcr90.dll" Result="version" Variable="vcredist_2008sp1_x64_versionnumber" />
+
+    <bal:Condition Message="Installation failed because your version of Windows is too old. $(var.ProductName) requires Windows 7 SP1 or newer."><![CDATA[Installed OR VersionNT > v6.1 OR (VersionNT = v6.1 AND ServicePackLevel >= 1)]]></bal:Condition>
+    <Chain>
+      <PackageGroupRef Id="NetFx45Web"/>
+
+      <!-- Python -> CRT90 -->
+      <ExePackage Id="vcredist_2008SP1_x64.exe"
+                  Name="vc_redist.x64.$(var.Vc9RedistVersion).exe"
+                  InstallCommand="/q"
+                  RepairCommand="/q"
+                  UninstallCommand="/qu"
+                  Protocol="none"
+                  Compressed="$(var.Compressed)"
+                  Permanent="yes"
+                  DetectCondition="vcredist_2008sp1_x64_versionnumber >= $(var.Vc9RedistVersion)"
+                  PerMachine="yes"
+                  Vital="yes"
+                  Cache="no"
+                  SuppressSignatureVerification="yes"
+                  SourceFile="Redist\VCRedist_2008SP1\vc_redist.x64.$(var.Vc9RedistVersion).exe"
+                  DownloadUrl="https://download.microsoft.com/download/9/7/7/977B481A-7BA6-4E30-AC40-ED51EB2028F2/vcredist_x64.exe"
+      />
+
+      <ExePackage Id="vcredist_2015_x86.exe"
+                  Name="vc_redist.x86.$(var.VcRedistVersion).exe"
+                  InstallCommand="/norestart /q /chainingpackage ADMINDEPLOYMENT"
+                  RepairCommand="/norestart /q /chainingpackage ADMINDEPLOYMENT"
+                  UninstallCommand="/norestart /q /chainingpackage ADMINDEPLOYMENT"
+                  Protocol="netfx4"
+                  Compressed="$(var.Compressed)"
+                  Permanent="yes"
+                  DetectCondition="vcredist_2015_x86_installed AND vcredist_2015_x86_version AND vcredist_2015_x86_versionnumber >= $(var.VcRedistVersion)"
+                  PerMachine="yes"
+                  Vital="yes"
+                  Cache="no"
+                  SuppressSignatureVerification="yes"
+                  SourceFile="Redist\VCRedist_2015\vc_redist.x86.$(var.VcRedistVersion).exe"
+                  DownloadUrl="https://download.microsoft.com/download/0/6/4/064F84EA-D1DB-4EAA-9A5C-CC2F0FF6A638/vc_redist.x86.exe"
+      />
+
+      <ExePackage Id="vcredist_2015_x64.exe"
+                  Name="vc_redist.x64.$(var.VcRedistVersion).exe"
+                  InstallCommand="/norestart /q /chainingpackage ADMINDEPLOYMENT"
+                  RepairCommand="/norestart /q /chainingpackage ADMINDEPLOYMENT"
+                  UninstallCommand="/norestart /q /chainingpackage ADMINDEPLOYMENT"
+                  Protocol="netfx4"
+                  Compressed="$(var.Compressed)"
+                  Permanent="yes"
+                  InstallCondition="VersionNT64"
+                  DetectCondition="vcredist_2015_x64_installed AND vcredist_2015_x64_version AND vcredist_2015_x64_versionnumber >= $(var.VcRedistVersion)"
+                  PerMachine="yes"
+                  Vital="yes"
+                  Cache="yes"
+                  SuppressSignatureVerification="yes"
+                  SourceFile="Redist\VCRedist_2015\vc_redist.x64.$(var.VcRedistVersion).exe"
+                  DownloadUrl="https://download.microsoft.com/download/0/6/4/064F84EA-D1DB-4EAA-9A5C-CC2F0FF6A638/vc_redist.x64.exe"
+                  />
+
+      <MsuPackage Id="Win61_KB2999226_x64"
+                  Name="Windows6.0-KB2999226-x64.msu"
+                  Compressed="$(var.Compressed)"
+                  Permanent="yes"
+                  InstallCondition="VersionNT64 AND VersionNT = v6.0"
+                  DetectCondition="UCRTVERSION64 >= v6.2.10585.0"
+                  Vital="yes"
+                  Cache="no"
+                  SuppressSignatureVerification="yes"
+                  SourceFile="Redist\KB2999226\Windows6.0-KB2999226-x64.msu"
+                  DownloadUrl="https://download.microsoft.com/download/5/4/E/54E27BE2-CFB2-4FC9-AB03-C39302CA68A0/Windows6.0-KB2999226-x64.msu"
+                  />
+
+      <MsuPackage Id="Win71_KB2999226_x64"
+                  Name="Windows6.1-KB2999226-x64.msu"
+                  Compressed="$(var.Compressed)"
+                  Permanent="yes"
+                  InstallCondition="VersionNT64 AND VersionNT = v6.1"
+                  DetectCondition="UCRTVERSION64 >= v6.2.10585.0"
+                  Vital="yes"
+                  Cache="no"
+                  SuppressSignatureVerification="yes"
+                  SourceFile="Redist\KB2999226\Windows6.1-KB2999226-x64.msu"
+                  DownloadUrl="https://download.microsoft.com/download/1/1/5/11565A9A-EA09-4F0A-A57E-520D5D138140/Windows6.1-KB2999226-x64.msu"
+                  />
+
+      <MsuPackage Id="Win80_KB2999226_x64"
+                  Name="Windows8-RT-KB2999226-x64.msu"
+                  Compressed="$(var.Compressed)"
+                  Permanent="yes"
+                  InstallCondition="VersionNT64 AND VersionNT = v6.2"
+                  DetectCondition="UCRTVERSION64 >= v6.2.10585.0"
+                  Vital="yes"
+                  Cache="no"
+                  SuppressSignatureVerification="yes"
+                  SourceFile="Redist\KB2999226\Windows8-RT-KB2999226-x64.msu"
+                  DownloadUrl="https://download.microsoft.com/download/A/C/1/AC15393F-A6E6-469B-B222-C44B3BB6ECCC/Windows8-RT-KB2999226-x64.msu"
+                  />
+
+      <MsuPackage Id="Win81_KB2999226_x64"
+                  Name="Windows8.1-KB2999226-x64.msu"
+                  Compressed="$(var.Compressed)"
+                  Permanent="yes"
+                  InstallCondition="VersionNT64 AND VersionNT >= v6.3 AND ADVAPIVERSION < v6.3.10000.0"
+                  DetectCondition="UCRTVERSION64 >= v6.2.10585.0"
+                  Vital="yes"
+                  Cache="no"
+                  SuppressSignatureVerification="yes"
+                  SourceFile="Redist\KB2999226\Windows8.1-KB2999226-x64.msu"
+                  DownloadUrl="https://download.microsoft.com/download/9/6/F/96FD0525-3DDF-423D-8845-5F92F4A6883E/Windows8.1-KB2999226-x64.msu"
+                  />
+
+      <MsiPackage Id="GME"
+                  Name="GME_x64.msi"
+                  Compressed="yes"
+                  Visible="no"
+                  ForcePerMachine="yes"
+                  >
+        <MsiProperty Name="MSIUNINSTALLSUPERSEDEDCOMPONENTS" Value="1"/>
+      </MsiPackage>
+
+    </Chain>
+	</Bundle>
+</Wix>

Added: trunk/Install/RtfTheme.xml
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ trunk/Install/RtfTheme.xml	Mon Feb  5 11:28:23 2018	(r2737)
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
+<!--
+Copyright (c) .NET Foundation and contributors.
+This software is released under the Microsoft Reciprocal License (MS-RL) (the "License"); you may not use the software except in compliance with the License.
+
+The text of the Microsoft Reciprocal License (MS-RL) can be found online at:
+ http://opensource.org/licenses/ms-rl
+
+
+Microsoft Reciprocal License (MS-RL)
+
+This license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software.
+
+1. Definitions
+ The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning here as under U.S. copyright law.
+ A "contribution" is the original software, or any additions or changes to the software.
+ A "contributor" is any person that distributes its contribution under this license.
+ "Licensed patents" are a contributor's patent claims that read directly on its contribution.
+
+2. Grant of Rights
+ (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create.
+ (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software.
+
+3. Conditions and Limitations
+ (A) Reciprocal Grants- For any file you distribute that contains code from the software (in source code or binary format), you must provide recipients the source code to that file along with a copy of this license, which license will govern that file. You may license other files that are entirely your own work and do not contain code from the software under any terms you choose.
+ (B) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks.
+ (C) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically.
+ (D) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software.
+ (E) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license.
+ (F) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement.
+-->
+
+<Theme xmlns="http://wixtoolset.org/schemas/thmutil/2010">
+  <Window Width="685" Height="500" HexStyle="100a0000" FontId="0">#(loc.Caption)</Window>
+  <Font Id="0" Height="-12" Weight="500" Foreground="000000" Background="FFFFFF">Segoe UI</Font>
+  <Font Id="1" Height="-24" Weight="500" Foreground="000000">Segoe UI</Font>
+  <Font Id="2" Height="-22" Weight="500" Foreground="666666">Segoe UI</Font>
+  <Font Id="3" Height="-12" Weight="500" Foreground="000000" Background="FFFFFF">Segoe UI</Font>
+  <Font Id="4" Height="-12" Weight="500" Foreground="ff0000" Background="FFFFFF" Underline="yes">Segoe UI</Font>
+
+  <Image X="11" Y="11" Width="75" Height="75" ImageFile="logo.png" Visible="yes"/>
+  <Text X="95" Y="11" Width="-11" Height="64" FontId="1" Visible="yes" DisablePrefix="yes">#(loc.Title)</Text>
+
+  <Page Name="Help">
+    <Text X="11" Y="80" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.HelpHeader)</Text>
+    <Text X="11" Y="112" Width="-11" Height="-35" FontId="3" DisablePrefix="yes">#(loc.HelpText)</Text>
+    <Button Name="HelpCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.HelpCloseButton)</Button>
+  </Page>
+  <Page Name="Install">
+    <Richedit Name="EulaRichedit" X="11" Y="90" Width="-11" Height="-70" TabStop="yes" FontId="0" HexStyle="0x800000" />
+    <Checkbox Name="EulaAcceptCheckbox" X="-11" Y="-41" Width="260" Height="17" TabStop="yes" FontId="3" HideWhenDisabled="yes">#(loc.InstallAcceptCheckbox)</Checkbox>
+    <!-- Button Name="OptionsButton" X="-171" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.InstallOptionsButton)</Button !-->
+    <Button Name="InstallButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.InstallInstallButton)</Button>
+    <Button Name="WelcomeCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.InstallCloseButton)</Button>
+  </Page>
+  <Page Name="Options">
+    <Text X="11" Y="90" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.OptionsHeader)</Text>
+    <Text X="11" Y="121" Width="-11" Height="17" FontId="3" DisablePrefix="yes">#(loc.OptionsLocationLabel)</Text>
+    <Editbox Name="FolderEditbox" X="11" Y="143" Width="-91" Height="21" TabStop="yes" FontId="3" FileSystemAutoComplete="yes" />
+    <Button Name="BrowseButton" X="-11" Y="142" Width="75" Height="23" TabStop="yes" FontId="3">#(loc.OptionsBrowseButton)</Button>
+    <Checkbox Name="DevFilesCheckbox" X="11" Y="175" Width="250" Height="17" TabStop="yes" FontId="3">#(loc.OptionsDevFilesCheckbox)</Checkbox>
+    <Button Name="OptionsOkButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.OptionsOkButton)</Button>
+    <Button Name="OptionsCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.OptionsCancelButton)</Button>
+  </Page>
+  <Page Name="FilesInUse">
+    <Text X="11" Y="90" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.FilesInUseHeader)</Text>
+    <Text X="11" Y="121" Width="-11" Height="34" FontId="3" DisablePrefix="yes">#(loc.FilesInUseLabel)</Text>
+    <Text Name="FilesInUseText" X="11" Y="150" Width="-11" Height="-86" FontId="3" DisablePrefix="yes" HexStyle="0x0000C000"></Text>
+
+    <Button Name="FilesInUseCloseRadioButton" X="11" Y="-60" Width="-11" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes" HexStyle="0x000009">#(loc.FilesInUseCloseRadioButton)</Button>
+    <Button Name="FilesInUseDontCloseRadioButton" X="11" Y="-40" Width="-11" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes" HexStyle="0x000009">#(loc.FilesInUseDontCloseRadioButton)</Button>
+
+    <Button Name="FilesInUseOkButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.FilesInUseOkButton)</Button>
+    <Button Name="FilesInUseCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.FilesInUseCancelButton)</Button>
+  </Page>
+  <Page Name="Progress">
+    <Text X="11" Y="90" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.ProgressHeader)</Text>
+    <Text X="11" Y="121" Width="70" Height="17" FontId="3" DisablePrefix="yes">#(loc.ProgressLabel)</Text>
+    <Text Name="OverallProgressPackageText" X="85" Y="121" Width="-11" Height="17" FontId="3" DisablePrefix="yes">#(loc.OverallProgressPackageText)</Text>
+    <Progressbar Name="OverallCalculatedProgressbar" X="11" Y="143" Width="-11" Height="15" />
+    <Button Name="ProgressCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.ProgressCancelButton)</Button>
+  </Page>
+  <Page Name="Modify">
+    <Text X="11" Y="90" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.ModifyHeader)</Text>
+    <Button Name="RepairButton" X="-171" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.ModifyRepairButton)</Button>
+    <Button Name="UninstallButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.ModifyUninstallButton)</Button>
+    <Button Name="ModifyCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.ModifyCloseButton)</Button>
+  </Page>
+  <Page Name="Success">
+    <Text Name="SuccessHeader" X="11" Y="90"  Width="-11" Height="30" FontId="2" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.SuccessHeader)</Text>
+    <Text Name="SuccessInstallHeader" X="11" Y="90" Width="-11" Height="30" FontId="2" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.SuccessInstallHeader)</Text>
+    <Text Name="SuccessRepairHeader" X="11" Y="90" Width="-11" Height="30" FontId="2" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.SuccessRepairHeader)</Text>
+    <Text Name="SuccessUninstallHeader" X="11" Y="90" Width="-11" Height="30" FontId="2" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.SuccessUninstallHeader)</Text>
+    <Button Name="LaunchButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.SuccessLaunchButton)</Button>
+    <Text Name="SuccessRestartText" X="-11" Y="-51" Width="400" Height="34" FontId="3" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.SuccessRestartText)</Text>
+    <Button Name="SuccessRestartButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.SuccessRestartButton)</Button>
+    <Button Name="SuccessCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.SuccessCloseButton)</Button>
+  </Page>
+  <Page Name="Failure">
+    <Text Name="FailureHeader" X="11" Y="90" Width="-11" Height="30" FontId="2" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.FailureHeader)</Text>
+    <Text Name="FailureInstallHeader" X="11" Y="90" Width="-11" Height="30" FontId="2" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.FailureInstallHeader)</Text>
+    <Text Name="FailureUninstallHeader" X="11" Y="90" Width="-11" Height="30" FontId="2" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.FailureUninstallHeader)</Text>
+    <Text Name="FailureRepairHeader" X="11" Y="90" Width="-11" Height="30" FontId="2" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.FailureRepairHeader)</Text>
+    <Hypertext Name="FailureLogFileLink" X="11" Y="121" Width="-11" Height="42" FontId="3" TabStop="yes" HideWhenDisabled="yes">#(loc.FailureHyperlinkLogText)</Hypertext>
+    <Hypertext Name="FailureMessageText" X="22" Y="163" Width="-11" Height="51" FontId="3" TabStop="yes" HideWhenDisabled="yes" />
+    <Text Name="FailureRestartText" X="-11" Y="-51" Width="400" Height="34" FontId="3" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.FailureRestartText)</Text>
+    <Button Name="FailureRestartButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.FailureRestartButton)</Button>
+    <Button Name="FailureCloseButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.FailureCloseButton)</Button>
+  </Page>
+</Theme>



More information about the gme-commit mailing list