//////////////////////////////////////////////////////////////////////////////
//
// Copyright © 2002-2005, Microsoft Corporation.  All rights reserved.
//
// File: HostLMS.js
//
// Description: Contains the HostLMS implementation.
//
//////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////
// Class: HostLMS
//
// Purpose: Constructor function for HostLMS objects.  This class acts as an
//	    API abstraction layer to host-provided functions that are required
//	    in order to implement various viewer features (i.e. Notes, bookmarking,
//	    etc.).
//
// Parameters:
//	Object  oLMSAPI [in] - LMSAPI object instance
//
//////////////////////////////////////////////////////////////////////////////
function HostLMS(oLMSAPI)
{
	//////////////////////////////////////////////////////////////////////
	// PRIVATE VARIABLES
	//////////////////////////////////////////////////////////////////////

	var m_oLMSAPI = oLMSAPI;	// The viewer's SCORM API Adapter.

	//////////////////////////////////////////////////////////////////////
	// PUBLIC VARIABLES
	//////////////////////////////////////////////////////////////////////

	this.API = FindHostAPI();	// The Host LMS' SCORM API adapter.  
					
	//////////////////////////////////////////////////////////////////////
	// PUBLIC METHODS
	//////////////////////////////////////////////////////////////////////

	//--------------------------------------------------------------------
	// Function: GetScoIdFromItemId
	//
	// Purpose: Gets the LMS' SCO identifier for the given manifest
	//	    item identifier.
	//
	// Parameters:
	//	String sItemID [in] - Item identifier
	//
	// Returns: String
	//--------------------------------------------------------------------
	HostLMS.prototype.GetScoIdFromItemId=function(sItemID)
	{
		var sScoID = "";

		try
		{
			sScoID = m_oLMSAPI.LRNGetResourceIdFromItemId(sItemID);

			// Remove the 'R' that is prepended to the string.
			// Note: This change should go live on EK's site in September 2004.

			// Bug fix #19724: Don't strip-off leading R|R_ 
			//var oExp = new RegExp("^(R|R_)","g");
			//sScoID = sScoID.replace(oExp,"");
		}
		catch(e)
		{
		}

		return sScoID;
	}

	//--------------------------------------------------------------------
	// Function: GetItemIdFromScoId
	//
	// Purpose: Gets the manifest item identifier from the supplied LMS' SCO identifier.
	//
	// Parameters:
	//	String sScoID [in] - LMS SCO identifier
	//
	// Returns: String
	//--------------------------------------------------------------------
	HostLMS.prototype.GetItemIdFromScoId=function(sScoID)
	{
		return m_oLMSAPI.LRNGetItemIdFromResourceId(sScoID);	
	}

	//--------------------------------------------------------------------
	// Function: SetSco
	//
	// Purpose: Sets the current SCO based upon its LMS SCO identifier.
	//	    Note: For the EK platform, this function is called prior to 
	//	    invoking LMSInitialize().
	//
	// Parameters:
	//	String sScoID [in] - LMS SCO identifier
	//
	// Returns: None
	//--------------------------------------------------------------------
	HostLMS.prototype.SetSco=function(sScoID)
	{
		try
		{
			this.API.setSco(sScoID);
		}
		catch(e)
		{
		}
	}

	//--------------------------------------------------------------------
	// Function: IsComplete
	//
	// Purpose: Determines whether the specified SCO has been completed.
	//
	// Parameters:
	//	String sScoID [in] - LMS SCO identifier
	//
	// Returns: Boolean
	//--------------------------------------------------------------------
	HostLMS.prototype.IsComplete=function(sScoID)
	{
		var bIsComplete = false;

		try
		{
		 	bIsComplete = top.isComplete(sScoID);
		}
		catch(e)
		{
		}
		 
		return bIsComplete;
	}

	//--------------------------------------------------------------------
	// Function: SetComplete
	//
	// Purpose: Sets the completion status for the specified SCO.
	//
	// Parameters:
	//	String sScoID [in] - LMS SCO identifier
	//	Boolean bIsComplete [in] -
	//
	// Returns: None
	//--------------------------------------------------------------------
	 HostLMS.prototype.SetComplete=function(sScoID, bIsComplete)
	{
		try
		{
			top.setComplete(sScoID, bIsComplete);
		}
		catch(e)
		{
		}
	}

	//--------------------------------------------------------------------
	// Function: IsTopicDownloaded
	//
	// Purpose: Determines whether the specified topic has been donloaded
	//	    for use within the offline player.
	//
	// Parameters:
	//	String sScoID [in] - LMS SCO identifier
	//
	// Returns: Boolean
	//--------------------------------------------------------------------
	 HostLMS.prototype.IsTopicDownloaded=function(sScoID)
	{
		var bIsDownloaded = false;

		try
		{
			bIsDownloaded = top.isTopicDownloaded(sScoID);
		}
		catch(e)
		{
		}
		
		return bIsDownloaded;
	}

	//--------------------------------------------------------------------
	// Function: GetBookmarks
	//
	// Purpose: Returns an associative array of bookmarks.  Note: Array
	//	    indices are LMS SCO identifiers.
	//
	// Parameters: None
	//
	// Returns: Array
	//--------------------------------------------------------------------
	HostLMS.prototype.GetBookmarks=function()
	{
		var aBookmarks = null;

		try
		{
			aBookmarks = top.getBookmarks();
		}
		catch(e)
		{
		}
		
		return aBookmarks;
	}

	//--------------------------------------------------------------------
	// Function: SetBookmark
	//
	// Purpose: Sets a bookmark for the specified SCO.
	//
	// Parameters:
	//	String sScoID [in] - LMS SCO identifier
	//	String sValue [in] - Bookmark title
	//
	// Returns: None
	//--------------------------------------------------------------------
	HostLMS.prototype.SetBookmark=function(sScoID, sValue)
	{
		try
		{
			top.setBookmark(sScoID, sValue);
		}
		catch(e)
		{
		}
	}

	//--------------------------------------------------------------------
	// Function: GetNote
	//
	// Purpose: Returns a previously persisted note for the specified SCO.
	//
	// Parameters:
	//	String sScoID [in] - LMS SCO identifier
	//
	// Returns: String
	//--------------------------------------------------------------------
	HostLMS.prototype.GetNote=function(sScoID)
	{
		var sNote = "";

		try
		{
			sNote = top.getNote(sScoID);
		}
		catch(e)
		{
		}
		
		return sNote;
	}

	//--------------------------------------------------------------------
	// Function: SetNote
	//
	// Purpose: Persists a note for the specified SCO.
	//
	// Parameters:
	//	String sScoID [in] - LMS SCO identifier
	//	String sText [in] - Note text
	//
	// Returns: None
	//--------------------------------------------------------------------
	HostLMS.prototype.SetNote=function(sScoID,sText)
	{
		try
		{
			top.setNote(sScoID,sText);
		}
		catch(e)
		{
		}
	}

	//--------------------------------------------------------------------
	// Function: HasNote
	//
	// Purpose: Determines whether the specified SCO has notes. 
	//
	// Parameters:
	//	String sScoID [in] - LMS SCO identifier
	//
	// Returns: Boolean
	//--------------------------------------------------------------------
	 HostLMS.prototype.HasNote=function(sScoID)
	{
		var bHasNote = false;

		try
		{
			var aNotes = top.getNotes();
			bHasNote = (typeof(aNotes[sScoID]) == "undefined");
		}
		catch(e)
		{
		}

		return bHasNote;
	}

	//--------------------------------------------------------------------
	// Function: GetNotes
	//
	// Purpose: Gets an array of Sco identifiers that have notes. 
	//
	// Parameters: None
	//
	// Returns: Array
	//--------------------------------------------------------------------
	HostLMS.prototype.GetNotes=function()
	{
		var aNotes = null;

		try
		{
			aNotes = top.getNotes();
		}
		catch(e)
		{
		}

		return aNotes;
	}

	//--------------------------------------------------------------------
	// Function: GetViewerSetting
	//
	// Purpose: Gets the value of the specified property.
	//
	// Parameters:
	//	String sProperty [in] - Setting to retrieve
	//
	// Returns: String
	//--------------------------------------------------------------------
	 HostLMS.prototype.GetViewerSetting=function(sProperty)
	{
		var sValue = "";

		try
		{
			sValue = top.getStudentAttribute(sProperty);
		}
		catch(e)
		{
		}

		return sValue;
	}

	//--------------------------------------------------------------------
	// Function: SetViewerSetting
	//
	// Purpose: Sets the value of the specified property.
	//
	// Parameters:
	//	String sProperty [in] - Setting to set
	//	String sValue [in] - New value
	//
	// Returns: None
	//--------------------------------------------------------------------
	HostLMS.prototype.SetViewerSetting=function(sProperty,sValue)
	{
		try
		{
			top.setStudentAttribute(sProperty,sValue);
		}
		catch(e)
		{
		}
	}

	//--------------------------------------------------------------------
	// Function: IsAllHostSupportPresent
	//
	// Purpose: Determines whether all platform functions are present to
	//	    support various runtime features (i.e. Notes, Bookmarking, etc.).
	//
	// Parameters: None
	//
	// Returns: Boolean
	//--------------------------------------------------------------------
	 HostLMS.prototype.IsAllHostSupportPresent=function()
	{
		return ((typeof(top.isComplete) != "undefined")			&& 
			(typeof(top.setComplete) != "undefined")		&&
			(typeof(top.isTopicDownloaded) != "undefined")		&& 
			(typeof(top.getBookmarks) != "undefined")		&&
			(typeof(top.setBookmark) != "undefined")		&& 
			(typeof(top.getNote) != "undefined")			&&
			(typeof(top.setNote) != "undefined")			&& 
			(typeof(top.getNotes) != "undefined")			&&
			(typeof(top.getStudentAttribute) != "undefined")	&& 
			(typeof(top.setStudentAttribute) != "undefined"));
	}

	//////////////////////////////////////////////////////////////////////
	//PRIVATE METHODS.
	//////////////////////////////////////////////////////////////////////

	//--------------------------------------------------------------------
	// Function: FindHostAPI
	//
	// Purpose: Recursively searches the window hierarchy for the hosting
	//	    platform's SCORM API adapter object starting at the topmost
	//	    window.
	//
	// Parameters: None
	//
	// Returns: Object or Null
	//--------------------------------------------------------------------
	function FindHostAPI() 
	{ 
   		// Start at the topmost window - findAPI will recurse down through 
   		// all of the child frames 
   		var theAPI = LocateAPI(this.top); 

   		if (theAPI == null) 
   		{ 
      			// The API wasn't found in the current window's hierarchy.  If the 
      			// current window has an opener (was launched by another window), 
      			// check the opener's window hierarchy. 
      			if (typeof(this.opener) != "undefined") 
      			{ 
         			if (this.opener != null) 
         			{ 
            				theAPI = LocateAPI(this.opener.top); 
         			}
      			} 
   		} 

   		return theAPI; 
	}

	//--------------------------------------------------------------------
	// Function: LocateAPI
	//
	// Purpose: Searches the current window (win) and recursively looks in 
	//	    any child frames for the hosting platform's SCORM API adapter
	//	    object.
	//
	// Parameters:
	//	Object win [in] - Window object to search
	//
	// Returns: Object or Null
	//--------------------------------------------------------------------
	function LocateAPI(win) 
	{ 
		var theAPI = null;

   		// Search the window hierarchy for an object named "API"   
   		// Look in the current window (win) and recursively look in any child frames 

   		if (win.API != null) 
   		{ 
      			theAPI = win.API; 
   		} 
		else if (win.length > 0)  // does the window have frames? 
   		{ 
     			for (var i = 0; i < win.length; i++) 
      			{ 
         			theAPI = LocateAPI(win.frames[i]); 
         			if (theAPI != null) break; 
         		} 
   		} 

   		return theAPI; 
	}
}
// SIG // Begin signature block
// SIG // MIIbDwYJKoZIhvcNAQcCoIIbADCCGvwCAQExCzAJBgUr
// SIG // DgMCGgUAMGcGCisGAQQBgjcCAQSgWTBXMDIGCisGAQQB
// SIG // gjcCAR4wJAIBAQQQEODJBs441BGiowAQS9NQkAIBAAIB
// SIG // AAIBAAIBAAIBADAhMAkGBSsOAwIaBQAEFO1IChkkjdrq
// SIG // EENnTxpr52bM+IG5oIIV6jCCBIUwggNtoAMCAQICCmEF
// SIG // 9x4AAAAAADIwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UE
// SIG // BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNV
// SIG // BAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBD
// SIG // b3Jwb3JhdGlvbjEjMCEGA1UEAxMaTWljcm9zb2Z0IENv
// SIG // ZGUgU2lnbmluZyBQQ0EwHhcNMDkwNzEzMjMwMDE4WhcN
// SIG // MTAxMDEzMjMxMDE4WjCBgzELMAkGA1UEBhMCVVMxEzAR
// SIG // BgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1v
// SIG // bmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv
// SIG // bjENMAsGA1UECxMETU9QUjEeMBwGA1UEAxMVTWljcm9z
// SIG // b2Z0IENvcnBvcmF0aW9uMIIBIjANBgkqhkiG9w0BAQEF
// SIG // AAOCAQ8AMIIBCgKCAQEAtYypnJSEYRrMLiLEoJNkCd6F
// SIG // obCQXfzJbGi18e/8jmv0+KBu11HeYKMnY9T237ZM0kUL
// SIG // pz3Yb/7tpxhj0x/GgdS/BzeXQCt/519aNdmTT6vzKpLw
// SIG // po2B7AUk3Nu4YWNTYQI1ONa49e57VKbJWDXp9BXv2gds
// SIG // BS1NpLa6mzu4MTB+RbypoSU5DEOkRzuXnCBEcjfPUKBN
// SIG // TfTDZdxE0Qg7ON0+xRdsRsetcyTAj4nB6uq6zWipEtZY
// SIG // DFMWDP45A9aB8j5cV/N622bhBxjZGQMU9uZFmSpRTJDX
// SIG // Wu+vtzsMKU1tIK4Ht5Iu6GnKnzBC58MyigsiSjLonAzG
// SIG // UQMmAW2ScwIDAQABo4IBAjCB/zATBgNVHSUEDDAKBggr
// SIG // BgEFBQcDAzAdBgNVHQ4EFgQUh4G33+76d/pZBWM3BArX
// SIG // 6dqg4OAwDgYDVR0PAQH/BAQDAgeAMB8GA1UdIwQYMBaA
// SIG // FFdFdBxdsPbIQwXgjFQtjzKn/kiWMEkGA1UdHwRCMEAw
// SIG // PqA8oDqGOGh0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9w
// SIG // a2kvY3JsL3Byb2R1Y3RzL0NvZGVTaWdQQ0EuY3JsME0G
// SIG // CCsGAQUFBwEBBEEwPzA9BggrBgEFBQcwAoYxaHR0cDov
// SIG // L3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9Db2Rl
// SIG // U2lnUENBLmNydDANBgkqhkiG9w0BAQUFAAOCAQEANiGE
// SIG // 9Y+DIU2HqD+L58WkD0wwbll0mwuXdBapsfNwpK/CDDMk
// SIG // 86BK+sHkIca22epcW5Fh9yJt/zH8F07XzUDjndLltNL6
// SIG // jWwH2neayivuDVlHzwTCEGf66ulDO7fm0ZzZjiNgbhKb
// SIG // w9l+XFcy3ZQN333FSJJNSHa3osBTlT78OqOTfPKFBMfG
// SIG // hTiXNvgSkyIAmU55r5brWiCDrNBcWjCwAOJrOY8kido9
// SIG // DKRGeWI2U2rXyc2SCPuH5VT1fFnFxHd9sMEsmMeXbEOn
// SIG // +CD4g1RknmD44kqlZ9RJv1SIfVJE81HAJtHFfPCJ1hEJ
// SIG // KMJFRYAdkCK9jqIFPjyzT73XOeCIkzCCBM0wggO1oAMC
// SIG // AQICCmEWtSkAAAAAABAwDQYJKoZIhvcNAQEFBQAwdzEL
// SIG // MAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x
// SIG // EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv
// SIG // c29mdCBDb3Jwb3JhdGlvbjEhMB8GA1UEAxMYTWljcm9z
// SIG // b2Z0IFRpbWUtU3RhbXAgUENBMB4XDTEwMDEwNDIxMTIw
// SIG // M1oXDTEzMDEwNDIxMjIwM1owgbYxCzAJBgNVBAYTAlVT
// SIG // MRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS
// SIG // ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y
// SIG // YXRpb24xEDAOBgNVBAsTB25DaXBoZXIxJzAlBgNVBAsT
// SIG // Hm5DaXBoZXIgRFNFIEVTTjpBQ0QzLUFFNjYtRTBCNTEl
// SIG // MCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2Vy
// SIG // dmljZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
// SIG // ggEBAOMoqtk8Q0L4BhO64sf5wS9ZyzyV51SQbMNYlWKz
// SIG // D2y9g9stWIgIkgvbzXbHVsbg7irTiDtcyqlwowAjIixT
// SIG // OOhQx/EUCY0dy3yL9aYza6/IRl9Le17556bHL0KFZzaN
// SIG // YEryE2bcsDltzhDK3XIFWHKd8gA7ADntJlM+Hs3uUJLN
// SIG // hfQ6/YGhBV8L6UQO79VZQCYoy4JOTivIFCK7cB3kPdH9
// SIG // YHZUTDns73c4i4z+dK/nFvRwMbjLrdTdi7b6AK3tdBSw
// SIG // Rb78ZYjhrfxJ21/R1M50edSNhm+z9ZcHIS2aYcn8uhtM
// SIG // 0uiruVDk0yv0wdlN1kCsFKeIhXNeaD5jt0HUZr0CAwEA
// SIG // AaOCARkwggEVMB0GA1UdDgQWBBTh8K4PDQX8MvMcfRl/
// SIG // z8TFv5FVTTAfBgNVHSMEGDAWgBQjNPjZUkZwCu1A+3b7
// SIG // syuwwzWzDzBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8v
// SIG // Y3JsLm1pY3Jvc29mdC5jb20vcGtpL2NybC9wcm9kdWN0
// SIG // cy9NaWNyb3NvZnRUaW1lU3RhbXBQQ0EuY3JsMFgGCCsG
// SIG // AQUFBwEBBEwwSjBIBggrBgEFBQcwAoY8aHR0cDovL3d3
// SIG // dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNyb3Nv
// SIG // ZnRUaW1lU3RhbXBQQ0EuY3J0MBMGA1UdJQQMMAoGCCsG
// SIG // AQUFBwMIMA4GA1UdDwEB/wQEAwIGwDANBgkqhkiG9w0B
// SIG // AQUFAAOCAQEAjVtJKFSHyYqpk/6b+I1UcSCdwDiTJym5
// SIG // y5ZTios1tZQ3Fli9nj4XJ19ZL+Rdfh3iWdwH+2IY5WO/
// SIG // 9AvPTdpbMPbImv8mWb8ZwxCy8OMewQyZ2lWSxswS38BY
// SIG // TN2a1B0j+YYSROcmAuiAQWgWVDYdp2WzxDOh46SY2b5i
// SIG // kE+SN7apiBdUSB+dwiLYciq5wzCTPjfsKam5zgvVwskW
// SIG // pudeVQ3MgYRh6SwD25umG1MCOIsKWJEXyHFwFs4uxmP8
// SIG // eZ+DBIK0gecvV2mtuKUfIzZ29hWUhgoe6t0RO2ZE0hVa
// SIG // z6YrKB9OxQpzV0uVA2Ci6+kyfr09j6a9SSopwVcxwBDf
// SIG // UTCCBgcwggPvoAMCAQICCmEWaDQAAAAAABwwDQYJKoZI
// SIG // hvcNAQEFBQAwXzETMBEGCgmSJomT8ixkARkWA2NvbTEZ
// SIG // MBcGCgmSJomT8ixkARkWCW1pY3Jvc29mdDEtMCsGA1UE
// SIG // AxMkTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0
// SIG // aG9yaXR5MB4XDTA3MDQwMzEyNTMwOVoXDTIxMDQwMzEz
// SIG // MDMwOVowdzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldh
// SIG // c2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNV
// SIG // BAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEhMB8GA1UE
// SIG // AxMYTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBMIIBIjAN
// SIG // BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAn6Fssd/b
// SIG // SJIqfGsuGeG94uPFmVEjUK3O3RhOJA/u0afRTK10MCAR
// SIG // 6wfVVJUVSZQbQpKumFwwJtoAa+h7veyJBw/3DgSY8InM
// SIG // H8szJIed8vRnHCz8e+eIHernTqOhwSNTyo36Rc8J0F6v
// SIG // 0LBCBKL5pmyTZ9co3EZTsIbQ5ShGLieshk9VUgzkAyz7
// SIG // apCQMG6H81kwnfp+1pez6CGXfvjSE/MIt1NtUrRFkJ9I
// SIG // AEpHZhEnKWaol+TTBoFKovmEpxFHFAmCn4TtVXj+AZod
// SIG // UAiFABAwRu233iNGu8QtVJ+vHnhBMXfMm987g5OhYQK1
// SIG // HQ2x/PebsgHOIktU//kFw8IgCwIDAQABo4IBqzCCAacw
// SIG // DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUIzT42VJG
// SIG // cArtQPt2+7MrsMM1sw8wCwYDVR0PBAQDAgGGMBAGCSsG
// SIG // AQQBgjcVAQQDAgEAMIGYBgNVHSMEgZAwgY2AFA6sgmBA
// SIG // VieX5SUT/CrhClOVWeSkoWOkYTBfMRMwEQYKCZImiZPy
// SIG // LGQBGRYDY29tMRkwFwYKCZImiZPyLGQBGRYJbWljcm9z
// SIG // b2Z0MS0wKwYDVQQDEyRNaWNyb3NvZnQgUm9vdCBDZXJ0
// SIG // aWZpY2F0ZSBBdXRob3JpdHmCEHmtFqFKoKWtTHNY9AcT
// SIG // LmUwUAYDVR0fBEkwRzBFoEOgQYY/aHR0cDovL2NybC5t
// SIG // aWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMvbWlj
// SIG // cm9zb2Z0cm9vdGNlcnQuY3JsMFQGCCsGAQUFBwEBBEgw
// SIG // RjBEBggrBgEFBQcwAoY4aHR0cDovL3d3dy5taWNyb3Nv
// SIG // ZnQuY29tL3BraS9jZXJ0cy9NaWNyb3NvZnRSb290Q2Vy
// SIG // dC5jcnQwEwYDVR0lBAwwCgYIKwYBBQUHAwgwDQYJKoZI
// SIG // hvcNAQEFBQADggIBABCXisNcA0Q23em0rXfbznlRTQGx
// SIG // LnRxW20ME6vOvnuPuC7UEqKMbWK4VwLLTiATUJndekDi
// SIG // V7uvWJoc4R0Bhqy7ePKL0Ow7Ae7ivo8KBciNSOLwUxXd
// SIG // T6uS5OeNatWAweaU8gYvhQPpkSokInD79vzkeJkuDfcH
// SIG // 4nC8GE6djmsKcpW4oTmcZy3FUQ7qYlw/FpiLID/iBxoy
// SIG // +cwxSnYxPStyC8jqcD3/hQoT38IKYY7w17gX606Lf8U1
// SIG // K16jv+u8fQtCe9RTciHuMMq7eGVcWwEXChQO0toUmPU8
// SIG // uWZYsy0v5/mFhsxRVuidcJRsrDlM1PZ5v6oYemIp76Kb
// SIG // KTQGdxpiyT0ebR+C8AvHLLvPQ7Pl+ex9teOkqHQ1uE7F
// SIG // cSMSJnYLPFKMcVpGQxS8s7OwTWfIn0L/gHkhgJ4VMGbo
// SIG // QhJeGsieIiHQQ+kr6bv0SMws1NgygEwmKkgkX1rqVu+m
// SIG // 3pmdyjpvvYEndAYR7nYhv5uCwSdUtrFqPYmhdmG0bqET
// SIG // pr+qR/ASb/2KMmyy/t9RyIwjyWa9nR2HEmQCPS2vWY+4
// SIG // 5CHltbDKY7R4VAXUQS5QrJSwpXirs6CWdRrZkocTdSIv
// SIG // MqgIbqBbjCW/oO+EyiHW6x5PyZruSeD3AWVviQt9yGnI
// SIG // 5m7qp5fOMSn/DsVbXNhNG6HY+i+ePy5VFmvJE6P9MIIG
// SIG // gTCCBGmgAwIBAgIKYRUIJwAAAAAADDANBgkqhkiG9w0B
// SIG // AQUFADBfMRMwEQYKCZImiZPyLGQBGRYDY29tMRkwFwYK
// SIG // CZImiZPyLGQBGRYJbWljcm9zb2Z0MS0wKwYDVQQDEyRN
// SIG // aWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3Jp
// SIG // dHkwHhcNMDYwMTI1MjMyMjMyWhcNMTcwMTI1MjMzMjMy
// SIG // WjB5MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGlu
// SIG // Z3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMV
// SIG // TWljcm9zb2Z0IENvcnBvcmF0aW9uMSMwIQYDVQQDExpN
// SIG // aWNyb3NvZnQgQ29kZSBTaWduaW5nIFBDQTCCASIwDQYJ
// SIG // KoZIhvcNAQEBBQADggEPADCCAQoCggEBAJ+N34U3jLEG
// SIG // VmY2TtQK6zYjkR6vq41Y6cTPwZ86CiTExMResO4VFMX6
// SIG // PpkzaxlpcvR8BV/lmSVE1zUZipDcKI6QDO/VkGGt3twY
// SIG // cC2DyW+vhSz43bm5MP1xeByD/cipuYJnDXq4wQnCvBaX
// SIG // Vz8cmNNp1zCQkJCNMB/YJtSee4jZ4gntl0lF6wRSgXV7
// SIG // uLUiuC5Wu9fPqU48CoOiqDrFrbYBDmrPIrQjH2zVJ+e3
// SIG // fsG01TKteSUcQobinYX0V9obWS8tJpIpxbPXhaOeYFqU
// SIG // 5nuce16CNEtt/9TuJ9Ci3NGQDM59DhV8iKw0x8BsmIRK
// SIG // yUR5aCjfIoMNuIosSGHi/hECAwEAAaOCAiMwggIfMBAG
// SIG // CSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRXRXQcXbD2
// SIG // yEMF4IxULY8yp/5IljALBgNVHQ8EBAMCAcYwDwYDVR0T
// SIG // AQH/BAUwAwEB/zCBmAYDVR0jBIGQMIGNgBQOrIJgQFYn
// SIG // l+UlE/wq4QpTlVnkpKFjpGEwXzETMBEGCgmSJomT8ixk
// SIG // ARkWA2NvbTEZMBcGCgmSJomT8ixkARkWCW1pY3Jvc29m
// SIG // dDEtMCsGA1UEAxMkTWljcm9zb2Z0IFJvb3QgQ2VydGlm
// SIG // aWNhdGUgQXV0aG9yaXR5ghB5rRahSqClrUxzWPQHEy5l
// SIG // MFAGA1UdHwRJMEcwRaBDoEGGP2h0dHA6Ly9jcmwubWlj
// SIG // cm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL21pY3Jv
// SIG // c29mdHJvb3RjZXJ0LmNybDBUBggrBgEFBQcBAQRIMEYw
// SIG // RAYIKwYBBQUHMAKGOGh0dHA6Ly93d3cubWljcm9zb2Z0
// SIG // LmNvbS9wa2kvY2VydHMvTWljcm9zb2Z0Um9vdENlcnQu
// SIG // Y3J0MHYGA1UdIARvMG0wawYJKwYBBAGCNxUvMF4wXAYI
// SIG // KwYBBQUHAgIwUB5OAEMAbwBwAHkAcgBpAGcAaAB0ACAA
// SIG // qQAgADIAMAAwADYAIABNAGkAYwByAG8AcwBvAGYAdAAg
// SIG // AEMAbwByAHAAbwByAGEAdABpAG8AbgAuMBMGA1UdJQQM
// SIG // MAoGCCsGAQUFBwMDMA0GCSqGSIb3DQEBBQUAA4ICAQAw
// SIG // vLAgpGKgp+85JmE93KzGmdCGxC71gzJlXiI+m9aG+Oi2
// SIG // n8qL1jt1C6GRPkzdZHSMSfKIjBhnbP4VZka4OkZCl8iR
// SIG // N9Qksees0+pBFIN308lPBV+jFFK/lqQvPlZbEHXOU8PO
// SIG // BVRptGXJJKUP4SW4GrlN5QK5UB5Ps5gMHZUC7iJZrSLL
// SIG // BXQLBEV7BFng2A+z60z4YN3CeJ7Rup9r9/PufkQRQNK9
// SIG // uptLFghupL5V5KY4EqNI9BxVeoog0X3+kduUjy/Ce2um
// SIG // ZIVPo+UsNCldC7/1xzgvxCDEVjH2ac6F+AqR7NDWrro4
// SIG // BQzrbk9MnAMpqqL8GKApDA1cXFYjV9oclg3IJjbBRMvl
// SIG // 4eZvieeP6Zi1c9N44+2jATx05V68bPYhiWcF7JedtbH9
// SIG // r6bpcqXDNOEvn/n0ajniLQSCW/zQnK58nRH55rVTGXS6
// SIG // OUo5631Cs0o7Nz3CSnsnmOfiTpsbSlQ4aiM3vmq3SO7q
// SIG // Qg1JJJGOtwQul2/k50W7j039YNnXWcLYgNZgNHu3oZMg
// SIG // /oG4qqVcCemKDb4oTX7X6A/tZXjRMV+5ZtvfQucLzAIH
// SIG // jd//IAajRWW0szKNLpHiTbSpyfq8awQOsp/qn96kyQqW
// SIG // 9I332Jio8IUCCFmkIKYsCxryUgbtaeVkGBvgo6veynwU
// SIG // YUO4ZfU2o1UTK2csTRswTDGCBJEwggSNAgEBMIGHMHkx
// SIG // CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9u
// SIG // MRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
// SIG // b3NvZnQgQ29ycG9yYXRpb24xIzAhBgNVBAMTGk1pY3Jv
// SIG // c29mdCBDb2RlIFNpZ25pbmcgUENBAgphBfceAAAAAAAy
// SIG // MAkGBSsOAwIaBQCggb4wGQYJKoZIhvcNAQkDMQwGCisG
// SIG // AQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQB
// SIG // gjcCARUwIwYJKoZIhvcNAQkEMRYEFHa0QT4tsJ9PvpVV
// SIG // LYfosuQapMu1MF4GCisGAQQBgjcCAQwxUDBOoCaAJABN
// SIG // AGkAYwByAG8AcwBvAGYAdAAgAEwAZQBhAHIAbgBpAG4A
// SIG // Z6EkgCJodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vbGVh
// SIG // cm5pbmcgMA0GCSqGSIb3DQEBAQUABIIBAK3nqvwgw9GG
// SIG // s8C1UL2NzRfKA3vGHMFbxXNj6ERQ4VeiJ7qy3K3DyNGg
// SIG // ooU0HY6q3nFiVBpq0UnuGBdqJwLZy+ZRAJ0ebUPC0zi6
// SIG // GyQnGlibnAUiv8SScrZWmbCIo5ZcukiZuBn/mXw7kitw
// SIG // JUSVd9wGVVJbsGTfUO1x+E+4bBD+3a13qXCqubmTYCTd
// SIG // qP20200UPALrIiWthdafIfinvV7xZf/p0KdWWTa63hI3
// SIG // hnQJjpBrEB00Pzt5Ez0YK0sOUXDgpP4TxA3BDo2j3Rea
// SIG // AWO1ZfAqj7EPACdRa5VGig193I++maekj8GmksPEJ2/H
// SIG // heohedEfzIUwkvh8EdCgPU+hggIdMIICGQYJKoZIhvcN
// SIG // AQkGMYICCjCCAgYCAQEwgYUwdzELMAkGA1UEBhMCVVMx
// SIG // EzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1Jl
// SIG // ZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh
// SIG // dGlvbjEhMB8GA1UEAxMYTWljcm9zb2Z0IFRpbWUtU3Rh
// SIG // bXAgUENBAgphFrUpAAAAAAAQMAcGBSsOAwIaoF0wGAYJ
// SIG // KoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0B
// SIG // CQUxDxcNMTAwMjE5MjIzNzMzWjAjBgkqhkiG9w0BCQQx
// SIG // FgQU+ZL2ZdW4XYu5W9jWjGy73ljHkk8wDQYJKoZIhvcN
// SIG // AQEFBQAEggEAELkqvXZzel64BJ+WT84Ta+1dfGUHAdhw
// SIG // U/saG7N5gprwj3C3/kN6RkYFlNIGQxA2uzUS/gj7g9+X
// SIG // c+93dCxOLwbhSKNHkPku2P6lxtyRahjBXx7x3e+6JnzT
// SIG // 1j17mMLdP1wwPWPGE1GQNwkneof7pEsFCwRA529DTL4w
// SIG // ZNeCsnQ5dLH/r02R5zAZ3viP2NeMO8hi7sI8KIkUzFDJ
// SIG // DGlt5iN1jbOz8S0qQtGY26U/sXna3kQMmubjDF19QrWK
// SIG // XhcoA0NfpACuXE2UYraDgmG6FxSn6K4FTv1auTudwlKH
// SIG // zugKMH87hh4Ud+JorlYXu2D9WxHWSG4SrWwNaRG5Ly/J9A==
// SIG // End signature block
