<?xml version="1.0"?>
<!--
    Copyright 1991-2015 Amebis

    This file is part of MSIBuild.

    MSIBuild is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    MSIBuild is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with MSIBuild. If not, see <http://www.gnu.org/licenses/>.
-->
<package>
	<job id="MakeDDF">
		<runtime>
			<description>Compile DDF file for shared CAB archive from input MSI files.</description>
			<unnamed name="&lt;output.ddf&gt;" helpstring="Output DDF file" required="true"/>
			<unnamed name="&lt;input.msi ...&gt;" helpstring="Input MSI files" required="true"/>
			<named name="I" helpstring="Input files folder" type="string" required="false"/>
			<named name="O" helpstring="CAB archive base name (default &quot;Dat&quot;)" type="string" required="false"/>
			<named name="C" helpstring="Compression (default &quot;MSZIP&quot;)" type="string" required="false"/>
		</runtime>
		<script language="JScript" src="MSI.js"/>
		<script language="JScript" src="String.js"/>
		<script language="JScript"><![CDATA[
			if (WScript.Arguments.Unnamed.Length < 2) {
				WScript.Arguments.ShowUsage();
				WScript.Quit(1);
			}

			var
				fso      = WScript.CreateObject("Scripting.FileSystemObject"),
				ddf_path = WScript.Arguments.Unnamed(0);

			try {
				var
					installer   = WScript.CreateObject("WindowsInstaller.Installer"),
					input_path  = WScript.Arguments.Named.Exists("I") ? WScript.Arguments.Named("I") : null,
					output_base = WScript.Arguments.Named.Exists("O") ? WScript.Arguments.Named("O") : "Dat",
					compression = WScript.Arguments.Named.Exists("C") ? WScript.Arguments.Named("C") : "MSZIP",
					files       = new Array(),
					i, n = WScript.Arguments.Unnamed.length;

				// No user interaction is desired.
				installer.UILevel = msiUILevelNone;

				for (i = 1; i < n; i++) {
					var
						msi_path = WScript.Arguments.Unnamed(i),
						d;

					try {
						d = MSIGetFiles(installer, msi_path, input_path);
						MSIMergeFiles(files, d);
					} catch (err) {
						throw new Error(err.number, "" + msi_path + ": " + err.description);
					}

					// Force JScript engine to free database and session objects, otherwise opening of another session will fail.
					CollectGarbage();
				}

				// Create DDF file and write header properties.
				var
					dat = fso.CreateTextFile(ddf_path, true, false);

				try {
					dat.WriteLine(".Set CabinetNameTemplate=" + output_base + "*.cab");
					dat.WriteLine(".Set CabinetName1=" + output_base + ".cab");
					dat.WriteLine(".Set InfFileName=" + output_base + ".inf");
					dat.WriteLine(".Set RptFileName=" + output_base + ".rpt");
					dat.WriteLine(".Set ReservePerCabinetSize=8");
					dat.WriteLine(".Set MaxDiskSize=0");
					dat.WriteLine(".Set CompressionType=" + compression);
					dat.WriteLine(".Set InfFileLineFormat=(*disk#*) *file#*: *file* = *Size*");
					dat.WriteLine(".Set InfHeader=");
					dat.WriteLine(".Set InfFooter=");
					dat.WriteLine(".Set InfDateFormat=yyyy-mm-dd");
					dat.WriteLine(".Set DiskDirectoryTemplate=");
					dat.WriteLine(".Set Compress=ON");
					dat.WriteLine(".Set Cabinet=ON");
					//if (input_path)
					//	dat.WriteLine(".Set SourceDir=" + input_path);
					for (fileKey in files) {
						var
							f = fso.GetFile(files[fileKey]),
							d = new Date(f.DateLastModified);

						// Seconds should be even. This is MAKECAB limitation.
						d.setSeconds(Math.round(d.getSeconds() / 2) * 2);

						dat.WriteLine("\"" + files[fileKey] + "\" /Date=" + d.getFullYear() + "-" + (d.getMonth() + 1) + "-" + d.getDate() + " /Time=" + Time2Str(d) + " " + fileKey);
					}
				} finally {
					dat.Close();
				}
			} catch (err) {
				// In case of error, delete output file.
				if (fso.FileExists(ddf_path))
					fso.DeleteFile(ddf_path);

				throw err;
			}

			WScript.Quit(0);
		]]></script>
	</job>
	<job id="MakeDEP">
		<runtime>
			<description>Compile DEP dependency file from input MSI files.</description>
			<unnamed name="&lt;output.dep&gt;" helpstring="Output DEP file" required="true"/>
			<unnamed name="&lt;target file&gt;" helpstring="Target file dependant of input" required="true"/>
			<unnamed name="&lt;input.msi ...&gt;" helpstring="Input MSI files" required="true"/>
			<named name="I" helpstring="Input files folder" type="string" required="false"/>
		</runtime>
		<script language="JScript" src="MSI.js"/>
		<script language="JScript"><![CDATA[
			if (WScript.Arguments.Unnamed.Length < 3) {
				WScript.Arguments.ShowUsage();
				WScript.Quit(1);
			}

			var
				fso      = WScript.CreateObject("Scripting.FileSystemObject"),
				dep_path = WScript.Arguments.Unnamed(0);

			try {
				var
					installer   = WScript.CreateObject("WindowsInstaller.Installer"),
					input_path  = WScript.Arguments.Named.Exists("I") ? WScript.Arguments.Named("I") : null,
					target_path = WScript.Arguments.Unnamed(1),
					files       = new Array(),
					i, n = WScript.Arguments.Unnamed.length;

				// No user interaction is desired.
				installer.UILevel = msiUILevelNone;

				for (i = 2; i < n; i++) {
					var
						msi_path = WScript.Arguments.Unnamed(i),
						d;

					d = MSIGetFiles(installer, msi_path, input_path);
					MSIMergeFiles(files, d);

					// Force JScript engine to free database and session objects, otherwise opening of another session will fail.
					CollectGarbage();
				}

				var
					dat = fso.CreateTextFile(dep_path, true, false);

				try {
					dat.Write("\"" + target_path + "\" :");
					for (fileKey in files)
						dat.Write(" \\\r\n\t\"" + files[fileKey] + "\"");
					dat.WriteLine();
					dat.WriteLine();
				} finally {
					dat.Close();
				}
			} catch (err) {
				// In case of error, delete output file.
				if (fso.FileExists(dep_path))
					fso.DeleteFile(dep_path);

				throw err;
			}

			WScript.Quit(0);
		]]></script>
	</job>
	<job id="SetCAB">
		<runtime>
			<description>Configures MSI package to use external CAB file.</description>
			<unnamed name="&lt;database.msi&gt;" helpstring="Output MSI file" required="true"/>
			<unnamed name="&lt;input.inf&gt;" helpstring="Input INF file" required="true"/>
			<named name="I" helpstring="Input files folder" type="string" required="false"/>
			<named name="E" helpstring="Embed CAB file" type="simple" required="false"/>
		</runtime>
		<script language="JScript" src="MSI.js"/>
		<script language="JScript" src="String.js"/>
		<script language="JScript"><![CDATA[
			if (WScript.Arguments.Unnamed.Length < 2) {
				WScript.Arguments.ShowUsage();
				WScript.Quit(1);
			}

			var
				installer  = WScript.CreateObject("WindowsInstaller.Installer"),
				fso        = WScript.CreateObject("Scripting.FileSystemObject"),
				input_path = WScript.Arguments.Named.Exists("I") ? WScript.Arguments.Named("I") : "",
				embed      = WScript.Arguments.Named.Exists("E") ? true : false,
				msi_path   = WScript.Arguments.Unnamed(0),
				inf_path   = WScript.Arguments.Unnamed(1),
				cab_path   = null,
				cab_name;

			// No user interaction is desired.
			installer.UILevel = msiUILevelNone;

			var
				database     = installer.OpenDatabase(msi_path, msiOpenDatabaseModeTransact),
				session      = installer.OpenPackage(database, 1),
				shortNames   = session.Mode(msiRunModeSourceShortNames),
				lastSequence = 0,
				stat,
				view,
				record,
				updateMode,
				sumInfo,
				today = new Date();

			if (input_path)
				session.Property("OriginalDatabase") = input_path;

			stat = session.DoAction("CostInitialize");
			if (stat != 1)
				throw new Error("Error calling CostInitialize() (code " + stat + ").");

			var
				dat = fso.OpenTextFile(inf_path, 1);

			try {
				var
					section         = null,
					re_section      = new RegExp("^\\s*\\[([^\\]]*)\\]\\s*$", "i"),
					re_file_list    = new RegExp("^\\s*\\((\\d+)\\)\\s*(\\d+)\\s*[:]([^=]+)[=]\\s*(\\d+)\\s*$", "i"),
					re_cabinet_list = new RegExp("^\\s*(\\d+)\\s*[,]\\s*(\\d+)\\s*[,](.*)$", "i");

				while (!dat.AtEndOfStream) {
					var
						s = new String(dat.ReadLine()),
						m;

					if (m = s.match(re_section)) {
						// We found a section.
						section = new String(m[1]);
					} else if (section.toLowerCase() == "file list") {
						if (m = s.match(re_file_list)) {
							var
								fileNum = parseInt(m[2], 10),
								fileId  = Trim(m[3]);

							// Set file sequence in database.
							view = database.OpenView("SELECT Sequence,Attributes FROM File WHERE File='" + _S(fileId) + "'");
							view.Execute();
							record = view.Fetch();
							if (record) {
								record.IntegerData(1) = fileNum;
								// record.IntegerData(2) = (record.IntegerData(2) & ~msidbFileAttributesNoncompressed) | msidbFileAttributesCompressed;
								view.Modify(msiViewModifyUpdate, record);
							}
							view.Close();

							if (fileNum > lastSequence)
								lastSequence = fileNum;
						}
					} else if (section.toLowerCase() == "cabinet list") {
						if (m = s.match(re_cabinet_list)) {
							if (cab_path)
								throw new Error("INF file can contain one CAB archive only.");

							// Read archive file name.
							cab_path = Trim(m[3]);
							cab_name = cab_path.split("\\");
							cab_name = cab_name[cab_name.length - 1];
						}
					}
				}
			} finally {
				dat.Close();
			}

			view = database.OpenView("SELECT DiskId,LastSequence,Cabinet FROM Media ORDER BY DiskId");
			view.Execute();
			record = view.Fetch();
			updateMode = msiViewModifyUpdate;
			if (!record) {
				// Media table is empty.
				record = installer.CreateRecord(3);
				record.IntegerData(1) = 1;
				updateMode = msiViewModifyInsert;
			}
			record.IntegerData(2) = lastSequence;
			record.StringData(3)  = (embed ? "#" : "") + cab_name;
			view.Modify(updateMode, record);

			sumInfo = database.SummaryInformation(3);
			sumInfo.Property(PID_LASTPRINTED)  = today.getVarDate();
			sumInfo.Property(PID_LASTSAVE_DTM) = today.getVarDate();
			sumInfo.Property(PID_WORDCOUNT)    = (shortNames ? 1 : 0) | 2;
			sumInfo.Persist();

			if (embed) {
				view = database.OpenView("SELECT Name,Data FROM _Streams");
				view.Execute();
				record = installer.CreateRecord(2);
				record.StringData(1) = cab_name;
				record.SetStream(2, cab_path);
				view.Modify(msiViewModifyAssign, record);
			}

			// Commit database
			database.Commit();

			WScript.Quit(0);
		]]></script>
	</job>
	<job id="MakeMST">
		<runtime>
			<description>Build MSI language from differences between two MSI files.</description>
			<unnamed name="&lt;source.msi&gt;" helpstring="Original MSI file" required="true"/>
			<unnamed name="&lt;destination.msi&gt;" helpstring="Updated MSI file" required="true"/>
			<unnamed name="&lt;diff.mst&gt;" helpstring="Output MST file" required="true"/>
		</runtime>
		<script language="JScript" src="MSI.js"/>
		<script language="JScript" src="String.js"/>
		<script language="JScript"><![CDATA[
			if (WScript.Arguments.Unnamed.Length < 3) {
				WScript.Arguments.ShowUsage();
				WScript.Quit(1);
			}

			var
				fso      = WScript.CreateObject("Scripting.FileSystemObject"),
				mst_path = WScript.Arguments.Unnamed(2);

			try {
				var
					installer = WScript.CreateObject("WindowsInstaller.Installer"),
					db_src    = installer.OpenDatabase(WScript.Arguments.Unnamed(0), msiOpenDatabaseModeReadOnly),
					db_dst    = installer.OpenDatabase(WScript.Arguments.Unnamed(1), msiOpenDatabaseModeReadOnly);

				db_dst.GenerateTransform(db_src, mst_path);
				db_dst.CreateTransformSummaryInfo(db_src, mst_path, msiTransformErrorNone, msiTransformValidationNone);
			} catch (err) {
				// In case of error, delete output file.
				if (fso.FileExists(mst_path))
					fso.DeleteFile(mst_path);

				throw err;
			}

			WScript.Quit(0);
		]]></script>
	</job>
	<job id="AddStorage">
		<runtime>
			<description>Adds sub-storage to MSI file.</description>
			<unnamed name="&lt;database.msi&gt;" helpstring="MSI database file" required="true"/>
			<unnamed name="&lt;transform.mst&gt;" helpstring="MST file to add as a sub-storage" required="true"/>
			<unnamed name="&lt;name&gt;" helpstring="Sub-storage name" required="true"/>
		</runtime>
		<script language="JScript" src="MSI.js"/>
		<script language="JScript" src="String.js"/>
		<script language="JScript"><![CDATA[
			if (WScript.Arguments.Unnamed.Length < 3) {
				WScript.Arguments.ShowUsage();
				WScript.Quit(1);
			}

			var
				fso      = WScript.CreateObject("Scripting.FileSystemObject"),
				msi_path = WScript.Arguments.Unnamed(0);

			try {
				var
					installer   = WScript.CreateObject("WindowsInstaller.Installer"),
					database    = installer.OpenDatabase(msi_path, msiOpenDatabaseModeTransact),
					view        = database.OpenView("SELECT Name,Data FROM _Storages"),
					record      = installer.CreateRecord(2),
					stream_path = WScript.Arguments.Unnamed(1),
					stream_name = WScript.Arguments.Unnamed(2);

				try {
					// Inserts or updates sub-storage.
					record.StringData(1) = stream_name;
					view.Execute(record);
					record.SetStream(2, stream_path);
					view.Modify(msiViewModifyAssign, record);
				} catch (err) {
					throw new Error(err.number, "" + stream_path + ": " + err.description);
				}

				// Commit database
				database.Commit();
			} catch (err) {
				// In case of error, delete output file.
				if (fso.FileExists(msi_path))
					fso.DeleteFile(msi_path);

				throw err;
			}

			WScript.Quit(0);
		]]></script>
	</job>
	<job id="SetLangMST">
		<runtime>
			<description>Sets language transform MST list in MSI file.</description>
			<unnamed name="&lt;database.msi&gt;" helpstring="MSI database file" required="true"/>
			<unnamed name="&lt;name ...&gt;" helpstring="Sub-storage names of language transform MSTs" required="true"/>
		</runtime>
		<script language="JScript" src="MSI.js"/>
		<script language="JScript" src="String.js"/>
		<script language="JScript"><![CDATA[
			if (WScript.Arguments.Unnamed.Length < 2) {
				WScript.Arguments.ShowUsage();
				WScript.Quit(1);
			}

			var
				fso      = WScript.CreateObject("Scripting.FileSystemObject"),
				msi_path = WScript.Arguments.Unnamed(0);

			try {
				var
					installer   = WScript.CreateObject("WindowsInstaller.Installer"),
					database    = installer.OpenDatabase(msi_path, msiOpenDatabaseModeTransact),
					list        = "";

				// Prepare list of language transforms.
				for (var i = 1, n = WScript.Arguments.Unnamed.Length; i < n; i++)
					list += (i > 1 ? "," : "") + WScript.Arguments.Unnamed(i);

				// Get platform.
				var
					sumInfo   = database.SummaryInformation(1),
					template  = sumInfo.Property(PID_TEMPLATE),
					idx_delim = template.indexOf(";"),
					platform  = idx_delim >= 0 ? template.substring(0, idx_delim + 1) : ";";

				// Set template property.
				sumInfo.Property(PID_TEMPLATE) = platform + list;
				sumInfo.Persist();

				// Commit database
				database.Commit();
			} catch (err) {
				// In case of error, delete output file.
				if (fso.FileExists(msi_path))
					fso.DeleteFile(msi_path);

				throw err;
			}

			WScript.Quit(0);
		]]></script>
	</job>

<signature>
** SIG ** MIIXmAYJKoZIhvcNAQcCoIIXiTCCF4UCAQExCzAJBgUr
** SIG ** DgMCGgUAMGcGCisGAQQBgjcCAQSgWTBXMDIGCisGAQQB
** SIG ** gjcCAR4wJAIBAQQQcAVhGs441BGiowAQS9NQkAIBAAIB
** SIG ** AAIBAAIBAAIBADAhMAkGBSsOAwIaBQAEFEHEvk2w1IDu
** SIG ** raRVIFiVLN1o6XuBoIISyDCCA+4wggNXoAMCAQICEH6T
** SIG ** 6/t8xk5Z6kuad9QG/DswDQYJKoZIhvcNAQEFBQAwgYsx
** SIG ** CzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENh
** SIG ** cGUxFDASBgNVBAcTC0R1cmJhbnZpbGxlMQ8wDQYDVQQK
** SIG ** EwZUaGF3dGUxHTAbBgNVBAsTFFRoYXd0ZSBDZXJ0aWZp
** SIG ** Y2F0aW9uMR8wHQYDVQQDExZUaGF3dGUgVGltZXN0YW1w
** SIG ** aW5nIENBMB4XDTEyMTIyMTAwMDAwMFoXDTIwMTIzMDIz
** SIG ** NTk1OVowXjELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5
** SIG ** bWFudGVjIENvcnBvcmF0aW9uMTAwLgYDVQQDEydTeW1h
** SIG ** bnRlYyBUaW1lIFN0YW1waW5nIFNlcnZpY2VzIENBIC0g
** SIG ** RzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
** SIG ** AQCxrLNJVEuXHBIK2CV5kSJXKm/cuCbEQ3Nrwr8uUFr7
** SIG ** FMJ2jkMBJUO0oeJF9Oi3e8N0zCLXtJQAAvdN7b+0t0Qk
** SIG ** a81fRTvRRM5DEnMXgotptCvLmR6schsmTXEfsTHd+1Fh
** SIG ** AlOmqvVJLAV4RaUvic7nmef+jOJXPz3GktxK+Hsz5HkK
** SIG ** +/B1iEGc/8UDUZmq12yfk2mHZSmDhcJgFMTIyTsU2sCB
** SIG ** 8B8NdN6SIqvK9/t0fCfm90obf6fDni2uiuqm5qonFn1h
** SIG ** 95hxEbziUKFL5V365Q6nLJ+qZSDT2JboyHylTkhE/xni
** SIG ** RAeSC9dohIBdanhkRc1gRn5UwRN8xXnxycFxAgMBAAGj
** SIG ** gfowgfcwHQYDVR0OBBYEFF+a9W5czMx0mtTdfe8/2+xM
** SIG ** gC7dMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcwAYYW
** SIG ** aHR0cDovL29jc3AudGhhd3RlLmNvbTASBgNVHRMBAf8E
** SIG ** CDAGAQH/AgEAMD8GA1UdHwQ4MDYwNKAyoDCGLmh0dHA6
** SIG ** Ly9jcmwudGhhd3RlLmNvbS9UaGF3dGVUaW1lc3RhbXBp
** SIG ** bmdDQS5jcmwwEwYDVR0lBAwwCgYIKwYBBQUHAwgwDgYD
** SIG ** VR0PAQH/BAQDAgEGMCgGA1UdEQQhMB+kHTAbMRkwFwYD
** SIG ** VQQDExBUaW1lU3RhbXAtMjA0OC0xMA0GCSqGSIb3DQEB
** SIG ** BQUAA4GBAAMJm495739ZMKrvaLX64wkdu0+CBl03X6ZS
** SIG ** nxaN6hySCURu9W3rWHww6PlpjSNzCxJvR6muORH4KrGb
** SIG ** sBrDjutZlgCtzgxNstAxpghcKnr84nodV0yoZRjpeUBi
** SIG ** JZZux8c3aoMhCI5B6t3ZVz8dd0mHKhYGXqY4aiISo1EZ
** SIG ** g362MIIEozCCA4ugAwIBAgIQDs/0OMj+vzVuBNhqmBsa
** SIG ** UDANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQGEwJVUzEd
** SIG ** MBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xMDAu
** SIG ** BgNVBAMTJ1N5bWFudGVjIFRpbWUgU3RhbXBpbmcgU2Vy
** SIG ** dmljZXMgQ0EgLSBHMjAeFw0xMjEwMTgwMDAwMDBaFw0y
** SIG ** MDEyMjkyMzU5NTlaMGIxCzAJBgNVBAYTAlVTMR0wGwYD
** SIG ** VQQKExRTeW1hbnRlYyBDb3Jwb3JhdGlvbjE0MDIGA1UE
** SIG ** AxMrU3ltYW50ZWMgVGltZSBTdGFtcGluZyBTZXJ2aWNl
** SIG ** cyBTaWduZXIgLSBHNDCCASIwDQYJKoZIhvcNAQEBBQAD
** SIG ** ggEPADCCAQoCggEBAKJjCzlEuLsjp0RJuw7/ofBhClOT
** SIG ** sJjbrSwPSsVu/4Y8U1UPFc4EPyv9qZaW2b5heQtbyUyG
** SIG ** duXgQ0sile7CK0PBn9hotI5AT+6FOLkRxSPyZFjwFTJv
** SIG ** TlehroikAtcqHs1L4d1j1ReJMluwXplaqJ0oUA4X7pbb
** SIG ** YTtFUR3PElYLkkf8q672Zj1HrHBy55LnX80QucSDZJQZ
** SIG ** vSWA4ejSIqXQugJ6oXeTW2XD7hd0vEGGKtwITIySjJEt
** SIG ** nndEH2jWqHR32w5bMotWizO92WPISZ06xcXqMwvS8aMb
** SIG ** 9Iu+2bNXizveBKd6IrIkri7HcMW+ToMmCPsLvalPmQjh
** SIG ** EChyqs0CAwEAAaOCAVcwggFTMAwGA1UdEwEB/wQCMAAw
** SIG ** FgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwDgYDVR0PAQH/
** SIG ** BAQDAgeAMHMGCCsGAQUFBwEBBGcwZTAqBggrBgEFBQcw
** SIG ** AYYeaHR0cDovL3RzLW9jc3Aud3Muc3ltYW50ZWMuY29t
** SIG ** MDcGCCsGAQUFBzAChitodHRwOi8vdHMtYWlhLndzLnN5
** SIG ** bWFudGVjLmNvbS90c3MtY2EtZzIuY2VyMDwGA1UdHwQ1
** SIG ** MDMwMaAvoC2GK2h0dHA6Ly90cy1jcmwud3Muc3ltYW50
** SIG ** ZWMuY29tL3Rzcy1jYS1nMi5jcmwwKAYDVR0RBCEwH6Qd
** SIG ** MBsxGTAXBgNVBAMTEFRpbWVTdGFtcC0yMDQ4LTIwHQYD
** SIG ** VR0OBBYEFEbGaaMOShQe1UzaUmMXP142vA3mMB8GA1Ud
** SIG ** IwQYMBaAFF+a9W5czMx0mtTdfe8/2+xMgC7dMA0GCSqG
** SIG ** SIb3DQEBBQUAA4IBAQB4O7SRKgBM8I9iMDd4o4QnB28Y
** SIG ** st4l3KDUlAOqhk4ln5pAAxzdzuN5yyFoBtq2MrRtv/Qs
** SIG ** JmMz5ElkbQ3mw2cO9wWkNWx8iRbG6bLfsundIMZxD82V
** SIG ** dNy2XN69Nx9DeOZ4tc0oBCCjqvFLxIgpkQ6A0RH83Vx2
** SIG ** bk9eDkVGQW4NsOo4mrE62glxEPwcebSAe6xp9P2ctgwW
** SIG ** K/F/Wwk9m1viFsoTgW0ALjgNqCmPLOGy9FqpAa8VnCwv
** SIG ** SRvbIrvD/niUUcOGsYKIXfA9tFGheTMrLnu53CAJE3Hr
** SIG ** ahlbz+ilMFcsiUk/uc9/yb8+ImhjU5q9aXSsxR08f5Lg
** SIG ** w7wc2AR1MIIEzjCCA7agAwIBAgIQMHo2eqo+aIGm+U8I
** SIG ** yzs5ZDANBgkqhkiG9w0BAQsFADB/MQswCQYDVQQGEwJV
** SIG ** UzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24x
** SIG ** HzAdBgNVBAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsx
** SIG ** MDAuBgNVBAMTJ1N5bWFudGVjIENsYXNzIDMgU0hBMjU2
** SIG ** IENvZGUgU2lnbmluZyBDQTAeFw0xNTEwMDkwMDAwMDBa
** SIG ** Fw0xODExMDcyMzU5NTlaMGExCzAJBgNVBAYTAlNJMREw
** SIG ** DwYDVQQIEwhTbG92ZW5pYTEPMA0GA1UEBxMGS2Ftbmlr
** SIG ** MRYwFAYDVQQKFA1BbWViaXMgZC5vLm8uMRYwFAYDVQQD
** SIG ** FA1BbWViaXMgZC5vLm8uMIIBIjANBgkqhkiG9w0BAQEF
** SIG ** AAOCAQ8AMIIBCgKCAQEAl/LoF3DHaSrIaG1pgBmBwDyl
** SIG ** Yt7sRvIuoEdGr/yMhV9RfUIft+xsTPVQOAirvgG+KUbc
** SIG ** E3KMnGH+VuK7Y+vYzRp3dYTLinSQz1NKYAELyTdVzmmY
** SIG ** mU3LX764yk3ABtSZsZwPoiCy+TXE9ZsCkugB2c7Qp9N/
** SIG ** O9EjjQDRwZlUa3nLoY96Y3qNPwkCn04ppYiqPeIXTRz8
** SIG ** XBLs4Nl/bD9wymEuNSV75vzobJ7BUYQwRU7lmNL2SwRY
** SIG ** ENaf0DpdiyFLBsNafHjGYiXQHgNxZUBpj7OoRDNBvMQY
** SIG ** L+LM8OrjhGIK1uGL5CqBD/p81ebeFsAZVxg9hrgnkPVQ
** SIG ** w77U0LZw8wIDAQABo4IBYjCCAV4wCQYDVR0TBAIwADAO
** SIG ** BgNVHQ8BAf8EBAMCB4AwKwYDVR0fBCQwIjAgoB6gHIYa
** SIG ** aHR0cDovL3N2LnN5bWNiLmNvbS9zdi5jcmwwZgYDVR0g
** SIG ** BF8wXTBbBgtghkgBhvhFAQcXAzBMMCMGCCsGAQUFBwIB
** SIG ** FhdodHRwczovL2Quc3ltY2IuY29tL2NwczAlBggrBgEF
** SIG ** BQcCAjAZDBdodHRwczovL2Quc3ltY2IuY29tL3JwYTAT
** SIG ** BgNVHSUEDDAKBggrBgEFBQcDAzBXBggrBgEFBQcBAQRL
** SIG ** MEkwHwYIKwYBBQUHMAGGE2h0dHA6Ly9zdi5zeW1jZC5j
** SIG ** b20wJgYIKwYBBQUHMAKGGmh0dHA6Ly9zdi5zeW1jYi5j
** SIG ** b20vc3YuY3J0MB8GA1UdIwQYMBaAFJY7U/B5M5evfYPv
** SIG ** LivMyreGHnJmMB0GA1UdDgQWBBT3B72WgJotdMR/DD09
** SIG ** J93UkAqfzDANBgkqhkiG9w0BAQsFAAOCAQEAinEvQC+1
** SIG ** yttKEsqAjt2YufpYlul3OQH17YKbUy4AAiKiAsUXWfTu
** SIG ** XRVdkT6CrEYcHyOLaHfe36jVHw8vLIiR2cyEcB3vweyr
** SIG ** JnNpt+Za4I/XZMoG/vvCJmSltOj8C/7PRKWklGgynPNe
** SIG ** HI8+0d1vLzRtK77hFeV7CIMIfnpoYThJKTSLxdr0kn+j
** SIG ** M8otfdLN2aDonnxe0Mf+2rkrX8AFIIHPpIXZj2X2VEmk
** SIG ** ZdyFINgI+KlJVQY/RY9BFMM2htLAIkNcDP1QVzFajhGH
** SIG ** yj+C+UtZQf5PceGYtJHNeq3cm6omjnEfyzi8/NwYFlkW
** SIG ** hvzJEH3woPqKgUramNFFLD0W5zCCBVkwggRBoAMCAQIC
** SIG ** ED141/l2SWCyYX308B7KhiowDQYJKoZIhvcNAQELBQAw
** SIG ** gcoxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2ln
** SIG ** biwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3Qg
** SIG ** TmV0d29yazE6MDgGA1UECxMxKGMpIDIwMDYgVmVyaVNp
** SIG ** Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s
** SIG ** eTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMyBQdWJs
** SIG ** aWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
** SIG ** eSAtIEc1MB4XDTEzMTIxMDAwMDAwMFoXDTIzMTIwOTIz
** SIG ** NTk1OVowfzELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5
** SIG ** bWFudGVjIENvcnBvcmF0aW9uMR8wHQYDVQQLExZTeW1h
** SIG ** bnRlYyBUcnVzdCBOZXR3b3JrMTAwLgYDVQQDEydTeW1h
** SIG ** bnRlYyBDbGFzcyAzIFNIQTI1NiBDb2RlIFNpZ25pbmcg
** SIG ** Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
** SIG ** AQCXgx4AFq8ssdIIxNdok1FgHnH24ke021hNI2JqtL9a
** SIG ** G1H3ow0Yd2i72DarLyFQ2p7z518nTgvCl8gJcJOp2lwN
** SIG ** TqQNkaC07BTOkXJULs6j20TpUhs/QTzKSuSqwOg5q1PM
** SIG ** IdDMz3+b5sLMWGqCFe49Ns8cxZcHJI7xe74xLT1u3LWZ
** SIG ** Qp9LYZVfHHDuF33bi+VhiXjHaBuvEXgamK7EVUdT2bMy
** SIG ** 1qEORkDFl5KK0VOnmVuFNVfT6pNiYSAKxzB3JBFNYoO2
** SIG ** untogjHuZcrf+dWNsjXcjCtvanJcYISc8gyUXsBWUgBI
** SIG ** zNP4pX3eL9cT5DiohNVGuBOGwhud6lo43ZvbAgMBAAGj
** SIG ** ggGDMIIBfzAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUH
** SIG ** MAGGE2h0dHA6Ly9zMi5zeW1jYi5jb20wEgYDVR0TAQH/
** SIG ** BAgwBgEB/wIBADBsBgNVHSAEZTBjMGEGC2CGSAGG+EUB
** SIG ** BxcDMFIwJgYIKwYBBQUHAgEWGmh0dHA6Ly93d3cuc3lt
** SIG ** YXV0aC5jb20vY3BzMCgGCCsGAQUFBwICMBwaGmh0dHA6
** SIG ** Ly93d3cuc3ltYXV0aC5jb20vcnBhMDAGA1UdHwQpMCcw
** SIG ** JaAjoCGGH2h0dHA6Ly9zMS5zeW1jYi5jb20vcGNhMy1n
** SIG ** NS5jcmwwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUF
** SIG ** BwMDMA4GA1UdDwEB/wQEAwIBBjApBgNVHREEIjAgpB4w
** SIG ** HDEaMBgGA1UEAxMRU3ltYW50ZWNQS0ktMS01NjcwHQYD
** SIG ** VR0OBBYEFJY7U/B5M5evfYPvLivMyreGHnJmMB8GA1Ud
** SIG ** IwQYMBaAFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG
** SIG ** SIb3DQEBCwUAA4IBAQAThRoeaak396C9pK9+HWFT/p2M
** SIG ** XgymdR54FyPd/ewaA1U5+3GVx2Vap44w0kRaYdtwb9oh
** SIG ** BcIuc7pJ8dGT/l3JzV4D4ImeP3Qe1/c4i6nWz7s1LzNY
** SIG ** qJJW0chNO4LmeYQW/CiwsUfzHaI+7ofZpn+kVqU/rYQu
** SIG ** Kd58vKiqoz0EAeq6k6IOUCIpF0yH5DoRX9akJYmbBWsv
** SIG ** tMkBTCd7C6wZBSKgYBU/2sn7TUyP+3Jnd/0nlMe6NQ6I
** SIG ** Sf6N/SivShK9DbOXBd5EDBX6NisD3MFQAfGhEV0U5eK9
** SIG ** J0tUviuEXg+mw3QFCu+Xw4kisR93873NQ9TxTKk/tYuE
** SIG ** r2Ty0BQhMYIEPDCCBDgCAQEwgZMwfzELMAkGA1UEBhMC
** SIG ** VVMxHTAbBgNVBAoTFFN5bWFudGVjIENvcnBvcmF0aW9u
** SIG ** MR8wHQYDVQQLExZTeW1hbnRlYyBUcnVzdCBOZXR3b3Jr
** SIG ** MTAwLgYDVQQDEydTeW1hbnRlYyBDbGFzcyAzIFNIQTI1
** SIG ** NiBDb2RlIFNpZ25pbmcgQ0ECEDB6NnqqPmiBpvlPCMs7
** SIG ** OWQwCQYFKw4DAhoFAKBwMBAGCisGAQQBgjcCAQwxAjAA
** SIG ** MBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisG
** SIG ** AQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMCMGCSqGSIb3
** SIG ** DQEJBDEWBBR6dTC/boD4AfXjRZuTKr/1zNmntzANBgkq
** SIG ** hkiG9w0BAQEFAASCAQBVo/5CV3pBnv4oB8K/31oUjG1k
** SIG ** 4oE2t6uXQQeMFe1oVWCcph6cS7RmxOoqyk5bV8flKUT1
** SIG ** 9Sna5fDh2xi3PG/HGZ4Ua4bWs210Qno8G9K/vh/PZeC0
** SIG ** /wqsYYWRKc6hyaQ3oc2whaalNNXGg+fQg/aNxHmuwgIY
** SIG ** Cljrdlr6bXThz7bOY6/NDddlqP1Pwnc3nihjPORnyf92
** SIG ** 2lpLjQKZvGDSTfpy9BKb5ZHwAtZyDI3enUXrKtOYjh4e
** SIG ** T+jbSX98K5L6dP/7BNqt4HsLXINTB2EjOQtRPCn5botw
** SIG ** 9cTczoWFiy8CQBve8GizZHKVkuH1bdc2uT+EvhjQEr3z
** SIG ** FXb8CWovoYICCzCCAgcGCSqGSIb3DQEJBjGCAfgwggH0
** SIG ** AgEBMHIwXjELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5
** SIG ** bWFudGVjIENvcnBvcmF0aW9uMTAwLgYDVQQDEydTeW1h
** SIG ** bnRlYyBUaW1lIFN0YW1waW5nIFNlcnZpY2VzIENBIC0g
** SIG ** RzICEA7P9DjI/r81bgTYapgbGlAwCQYFKw4DAhoFAKBd
** SIG ** MBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZI
** SIG ** hvcNAQkFMQ8XDTE2MDkxMDA3MjMzNFowIwYJKoZIhvcN
** SIG ** AQkEMRYEFPXD/Zju3XrJ5FHNdYlywwjm6bxiMA0GCSqG
** SIG ** SIb3DQEBAQUABIIBAJIsJ9KLVyoPNgRe4QK0z/ssrOlc
** SIG ** NPZYckBVcPIvDp9J3jemLzqAXKLRvNgifYQRy8TQVRG5
** SIG ** hjOtVrmHSqYJFJgih/2gVLjfuJ6P4Z7ya+UL1tdNTrfY
** SIG ** eBSAeUP5t59GsX9nnyxrvOFuC1gUOlvMmfCywWmLI8N1
** SIG ** eyGamCkEmho4yDW/AHHUNPc6Ou2XiPMdy9EFvZ+aSv9p
** SIG ** ChD89Y9Tpm//1wEezp5FvkW7yqhp8sHKsDlQ9Ugi3wq0
** SIG ** NMnswUVNekGnA4INP+C8PoExozoftlhMQCNkFf2gnmz+
** SIG ** AuyM/w5rUzTReuw1dgaSadktExzlZqVQMdSmkrKXEZZj
** SIG ** HIABnZo=
</signature>
</package>
