function mxShapeLeanTimeline(bounds, fill, stroke, strokewidth)
{
	mxShape.call(this);
	this.bounds = bounds;
	this.fill = fill;
	this.stroke = stroke;
	this.strokewidth = (strokewidth != null) ? strokewidth : 1;
}
*******************************************************************************************************************************************************
//Electronical Info
//**********************************************************************************************************************************************************
function mxLeanElectronicInfoShape()
{
	mxArrow.call(this);
};

mxUtils.extend(mxLeanElectronicInfoShape, mxArrow);

mxLeanElectronicInfoShape.prototype.paintEdgeShape = function(c, pts)
{
	// Base vector (between end points)
	var p0 = pts[0];
	var pe = pts[pts.length - 1];
	
	var dx = pe.x - p0.x;
	var dy = pe.y - p0.y;
	
	p0.x = p0.x + dx * 0.05;
	p0.y = p0.y + dy * 0.05;
	pe.x = pe.x - dx * 0.05;
	pe.y = pe.y - dy * 0.05;
	dx = pe.x - p0.x;
	dy = pe.y - p0.y;
	
	var dist = Math.sqrt(dx * dx + dy * dy);
	var nx = dx / dist;
	var ny = dy / dist;
	var midX = p0.x + dx * 0.5; 
	var midY = p0.y + dy * 0.5;
	
	var p1x = midX - nx * dist * 0.1 - ny / 3 * dist * 0.1;
	var p1y = midY - ny * dist * 0.1 + nx / 3 * dist * 0.1;
	var p4x = midX + nx * dist * 0.1 + ny / 3 * dist * 0.1;
	var p4y = midY + ny * dist * 0.1 - nx / 3 * dist * 0.1;

	c.begin();
	c.moveTo(p0.x, p0.y);
	c.lineTo(p4x, p4y);
	c.lineTo(p1x, p1y);
	c.lineTo(pe.x, pe.y);
	c.stroke();

	var dx = pe.x - p1x;
	var dy = pe.y - p1y;
	var dist = Math.sqrt(dx * dx + dy * dy);
	var nx = dx / dist;
	var ny = dy / dist;
	
	c.setFillColor(mxUtils.getValue(this.style, mxConstants.STYLE_STROKECOLOR, '#000000'));
	c.begin();
	c.moveTo(pe.x - nx * 10 - ny * 5, pe.y - ny * 10 + nx * 5);
	c.lineTo(pe.x, pe.y);
	c.lineTo(pe.x - nx * 10 + ny * 5, pe.y - ny * 10 - nx * 5);
	c.fillAndStroke();
};

// Registers the electronic info shape
mxCellRenderer.registerShape('mxgraph.lean_mapping.electronic_info_flow_edge', mxLeanElectronicInfoShape);

//**********************************************************************************************************************************************************
//Manual Info
//**********************************************************************************************************************************************************
function mxLeanManualInfoShape()
{
	mxArrow.call(this);
};

mxUtils.extend(mxLeanManualInfoShape, mxArrow);

mxLeanManualInfoShape.prototype.paintEdgeShape = function(c, pts)
{
	// Base vector (between end points)
	var p0 = pts[0];
	var pe = pts[pts.length - 1];
	
	var dx = pe.x - p0.x;
	var dy = pe.y - p0.y;
	
	p0.x = p0.x + dx * 0.05;
	p0.y = p0.y + dy * 0.05;
	pe.x = pe.x - dx * 0.05;
	pe.y = pe.y - dy * 0.05;
	dx = pe.x - p0.x;
	dy = pe.y - p0.y;
	
	var dist = Math.sqrt(dx * dx + dy * dy);
	var nx = dx / dist;
	var ny = dy / dist;
	
	c.begin();
	c.moveTo(p0.x, p0.y);
	c.lineTo(pe.x, pe.y);
	c.stroke();

	c.setFillColor(mxUtils.getValue(this.style, mxConstants.STYLE_STROKECOLOR, '#000000'));
	c.begin();
	c.moveTo(pe.x - nx * 10 - ny * 5, pe.y - ny * 10 + nx * 5);
	c.lineTo(pe.x, pe.y);
	c.lineTo(pe.x - nx * 10 + ny * 5, pe.y - ny * 10 - nx * 5);
	c.fillAndStroke();
};

//Registers the electronic info shape
mxCellRenderer.registerShape('mxgraph.lean_mapping.manual_info_flow_edge', mxLeanManualInfoShape);

//**********************************************************************************************************************************************************
//Timeline
//**********************************************************************************************************************************************************
/**
Extends mxShape.