| 
					
					
					
				 | 
				@ -1,4 +1,9 @@ | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				#include <pthread.h>
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				#include <errno.h>
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				#include <stdio.h>
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				#include <string.h>
 | 
			
		
		
	
		
			
				 | 
				 | 
				#include "SvrData.h"
 | 
				 | 
				 | 
				#include "SvrData.h"
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				bool SvrData::instanceFlag = false; | 
				 | 
				 | 
				bool SvrData::instanceFlag = false; | 
			
		
		
	
		
			
				 | 
				 | 
				SvrData* SvrData::single = 0; | 
				 | 
				 | 
				SvrData* SvrData::single = 0; | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
	
		
			
				| 
					
						
							
						
					
					
						
							
						
					
					
				 | 
				@ -26,7 +31,12 @@ SvrData::SvrData(void) | 
			
		
		
	
		
			
				 | 
				 | 
				        robot.max.torque[i] = maxTrqJnt[i]; | 
				 | 
				 | 
				        robot.max.torque[i] = maxTrqJnt[i]; | 
			
		
		
	
		
			
				 | 
				 | 
				        robot.max.range[i] = maxRangeJnt[i]; | 
				 | 
				 | 
				        robot.max.range[i] = maxRangeJnt[i]; | 
			
		
		
	
		
			
				 | 
				 | 
				    } | 
				 | 
				 | 
				    } | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    // init mutex for database
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    if (pthread_mutex_init(&dataLock, NULL) != 0) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        printf("mutex init failed\n"); | 
			
		
		
	
		
			
				 | 
				 | 
				} | 
				 | 
				 | 
				} | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				SvrData::~SvrData() | 
				 | 
				 | 
				SvrData::~SvrData() | 
			
		
		
	
		
			
				 | 
				 | 
				{ | 
				 | 
				 | 
				{ | 
			
		
		
	
		
			
				 | 
				 | 
				    if (robot.max.velocity != 0) | 
				 | 
				 | 
				    if (robot.max.velocity != 0) | 
			
		
		
	
	
		
			
				| 
					
					
					
						
							
						
					
				 | 
				@ -45,6 +55,7 @@ SvrData::~SvrData() | 
			
		
		
	
		
			
				 | 
				 | 
				    robot.max.accelaration = 0; | 
				 | 
				 | 
				    robot.max.accelaration = 0; | 
			
		
		
	
		
			
				 | 
				 | 
				    robot.max.torque = 0; | 
				 | 
				 | 
				    robot.max.torque = 0; | 
			
		
		
	
		
			
				 | 
				 | 
				    robot.max.range = 0; | 
				 | 
				 | 
				    robot.max.range = 0; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    pthread_mutex_destroy(&dataLock); | 
			
		
		
	
		
			
				 | 
				 | 
				} | 
				 | 
				 | 
				} | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				SvrData* SvrData::getInstance () | 
				 | 
				 | 
				SvrData* SvrData::getInstance () | 
			
		
		
	
	
		
			
				| 
					
					
					
						
							
						
					
				 | 
				@ -56,3 +67,165 @@ SvrData* SvrData::getInstance () | 
			
		
		
	
		
			
				 | 
				 | 
				    instanceFlag = true; | 
				 | 
				 | 
				    instanceFlag = true; | 
			
		
		
	
		
			
				 | 
				 | 
				    return single; | 
				 | 
				 | 
				    return single; | 
			
		
		
	
		
			
				 | 
				 | 
				} | 
				 | 
				 | 
				} | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				void SvrData::lock() | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				{ | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    pthread_mutex_lock(&dataLock); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				} | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				void SvrData::unlock() | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				{ | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    pthread_mutex_unlock(&dataLock); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				} | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				int SvrData::getMessuredJointPos(float* data, size_t size) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				{ | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    if (data == NULL) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        return -EINVAL; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    if (size != sizeof(messured.jointPos)) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        return -EINVAL; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    pthread_mutex_lock(&dataLock); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    memcpy(data,messured.jointPos,size); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    pthread_mutex_unlock(&dataLock); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				} | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				int SvrData::getMessuredCartPos (float* data, size_t size) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				{ | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    if (data == NULL) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        return -EINVAL; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    if (size != sizeof(messured.cartPos)) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        return -EINVAL; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    pthread_mutex_lock(&dataLock); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    memcpy(data,messured.cartPos,size); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    pthread_mutex_unlock(&dataLock); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				} | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				int SvrData::getMessuredJacobian(float* data, size_t size) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				{ | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    if (data == NULL) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        return -EINVAL; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    if (size != sizeof(messured.jacobian)) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        return -EINVAL; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    pthread_mutex_lock(&dataLock); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    memcpy(data,messured.jacobian,size); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    pthread_mutex_unlock(&dataLock); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				} | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				int SvrData::getMessuredForceTorque(float* data, size_t size) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				{ | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    if (data == NULL) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        return -EINVAL; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    if (size != sizeof(messured.forceAndTorque)) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        return -EINVAL; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    pthread_mutex_lock(&dataLock); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    memcpy(data,messured.forceAndTorque,size); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    pthread_mutex_unlock(&dataLock); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				} | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				int SvrData::getCommandedJointPos(float* data, size_t size) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				{ | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    if (data == NULL) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        return -EINVAL; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    if (size != sizeof(commanded.jointPos)) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        return -EINVAL; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    pthread_mutex_lock(&dataLock); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    memcpy(data,commanded.jointPos,size); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    pthread_mutex_unlock(&dataLock); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				} | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				int SvrData::getCommandedCartPos (float* data, size_t size) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				{ | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    if (data == NULL) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        return -EINVAL; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    if (size != sizeof(commanded.cartPos)) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        return -EINVAL; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    pthread_mutex_lock(&dataLock); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    memcpy(data,commanded.cartPos,size); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    pthread_mutex_unlock(&dataLock); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				} | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				float SvrData::getMaxTorque(unsigned int pos) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				{ | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    float retval = -1.0f; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    if (pos >= robot.joints) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        return retval; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    pthread_mutex_lock(&dataLock); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    retval = robot.max.torque[pos-1]; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    pthread_mutex_unlock(&dataLock); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				} | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				int   SvrData::getMaxTorque(float* data, size_t size) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				{ | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    if (data == NULL) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        return -EINVAL; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    if (size != sizeof(float)* robot.joints) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        return -EINVAL; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    pthread_mutex_lock(&dataLock); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    memcpy(data,robot.max.torque,size); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    pthread_mutex_unlock(&dataLock); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				} | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				float SvrData::getMaxAccelaration(unsigned int pos) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				{ | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    float retval = -1.0f; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    if (pos >= robot.joints) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        return retval; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    pthread_mutex_lock(&dataLock); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    retval = robot.max.accelaration[pos-1]; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    pthread_mutex_unlock(&dataLock); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				} | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				int   SvrData::getMaxAccelaration(float* data, size_t size) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				{ | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    if (data == NULL) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        return -EINVAL; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    if (size != sizeof(float)* robot.joints) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        return -EINVAL; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    pthread_mutex_lock(&dataLock); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    memcpy(data,robot.max.accelaration,size); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    pthread_mutex_unlock(&dataLock); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				} | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				float SvrData::getMaxRange(unsigned int pos) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				{ | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    float retval = -1.0f; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    if (pos >= robot.joints) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        return retval; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    pthread_mutex_lock(&dataLock); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    retval = robot.max.range[pos-1]; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    pthread_mutex_unlock(&dataLock); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				} | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				int   SvrData::getMaxRange(float* data, size_t size) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				{ | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    if (data == NULL) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        return -EINVAL; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    if (size != sizeof(float)* robot.joints) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        return -EINVAL; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    pthread_mutex_lock(&dataLock); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    memcpy(data,robot.max.range,size); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    pthread_mutex_unlock(&dataLock); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				} | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				unsigned int SvrData::getJoints() | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				{ | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    unsigned int retval = 0; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    pthread_mutex_lock(&dataLock); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    retval = robot.joints; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    pthread_mutex_unlock(&dataLock); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    return retval; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				} | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 |