@Override
	public void processLine(InOutParam inOutParam) {
		
		//Prepare output
		LineOutput lineOut = new LineOutput();
		try
		{
			//Remove "is" and "?"
			String formattedLine = this.line.split("(\\sis\\s)")[1];
			formattedLine = formattedLine.replace("?","").trim();
			
			// search for all numerals for their values to compute the result
			String[] keys = formattedLine.split("\\s");
			
			boolean isPresent = false;									//To track if key is present in the defined maps
			StringBuffer romanBuff = new StringBuffer();				//To track the roman numbers in the string										
			String errorMessage = null;									//Just in case an error is found				
			Stack<Double> computedValues = new Stack<Double>();			//Stack to keep track of computed variables in the string
			
			for(String key : keys)
			{
				//First look for the presence of key in assigned value map. If present it is a roman number
				isPresent = false;
				String romanValue = inOutParam.getAssignedValue(key);
				if(romanValue!=null)
				{
					romanBuff.append(romanValue);
					isPresent = true;
				}
				
				//If not found in assigned value map, then verify computed value map. If found add it to the stack.
				Double computedValue = inOutParam.getCalculatedValue(key);
				if(!isPresent && computedValue !=null)
				{
					computedValues.push(computedValue);
					isPresent = true;
				}
				
				if(!isPresent){
					errorMessage = ErrorMessage.NO_IDEA_ABOUT_INPUT.getValue();
					break;
				}
			}
			
			if(isPresent){
				
				double netCalculatedValue  = 1D;
				
				//Traverse the stack of computed variables and determine the actual worth of it. This is helpful in case we have more than two computed variables in the string
				for(int index = 0; index < computedValues.size(); index++){
					netCalculatedValue *= computedValues.get(index);
				}
				
				//Let us get the integer worth of it
				int netCredits = (int) netCalculatedValue;
				
				//If roman numbers are present, then multiply its worth by the calculated worth of computed variables
				if(romanBuff.length() > 0){
					netCredits = (int)(RomanNumber.convertRomanToArabic(romanBuff.toString()) * netCalculatedValue);
				}
				
				//Set output
				lineOut.setLineKey(formattedLine);
				lineOut.setLineValue(netCredits);
				lineOut.setCredits(true);
			}
			else{
				lineOut.setError(true);
				lineOut.setErrorMessage(errorMessage);
			}
			
			inOutParam.addToOutputList(lineOut);
		}
		catch(Exception e){
			ApplicationUtilities.print(ErrorMessage.INCORRECT_LINE_INPUT.getValue() + ApplicationConstant.COLON + line);
		}
				
	}