function mxShapeSysMLPackage(bounds, fill, stroke, strokewidth)
{
	mxShape.call(this);
	this.bounds = bounds;
	this.fill = fill;
	this.stroke = stroke;
	this.strokewidth = (strokewidth != null) ? strokewidth : 1;
}
*******************************************************************************************************************************************************
//Composite
//**********************************************************************************************************************************************************
function mxShapeSysMLComposite()
{
	mxCylinder.call(this);
};
	
mxUtils.extend(mxShapeSysMLComposite, mxShape);

mxShapeSysMLComposite.prototype.isHtmlAllowed = function()
{
	return false;
};

mxShapeSysMLComposite.prototype.paintForeground = function(c, x, y, w, h)
{
	if (this.style != null)
	{
		var shape = mxCellRenderer.defaultShapes[this.style['symbol0']];

		c.save();
			
		var tmp = new shape();
		tmp.style = this.style;
		shape.prototype.paintVertexShape.call(tmp, c, x, y, w, h);
		c.restore();

		c.setDashed(false);
			
		// Draws the symbols defined in the style. The symbols are
		// numbered from 1...n. Possible postfixes are align,
		// verticalAlign, spacing, arcSpacing, width, height
		var counter = 1;
			
		do
		{
			shape = mxCellRenderer.defaultShapes[this.style['symbol' + counter]];
				
			if (shape != null)
			{
				var align = this.style['symbol' + counter + 'Align'];
				var valign = this.style['symbol' + counter + 'VerticalAlign'];
				var width = this.style['symbol' + counter + 'Width'];
				var height = this.style['symbol' + counter + 'Height'];
				var spacing = this.style['symbol' + counter + 'Spacing'] || 0;
				var vspacing = this.style['symbol' + counter + 'VSpacing'] || 0;
				var arcspacing = this.style['symbol' + counter + 'ArcSpacing'];
				var direction = this.style['symbol' + counter + 'Direction'];
					
				if (arcspacing != null)
				{
					spacing += this.getArcSize(w + this.strokewidth, h + this.strokewidth) * arcspacing;
					vspacing += this.getArcSize(w + this.strokewidth, h + this.strokewidth) * arcspacing;
				}
					
				var x2 = x;
				var y2 = y;
					
				if (align == mxConstants.ALIGN_CENTER)
				{
					x2 += (w - width) / 2;
				}
				else if (align == mxConstants.ALIGN_RIGHT)
				{
					x2 += w - width - spacing;
				}
				else
				{
					x2 += spacing;
				}
					
				if (valign == mxConstants.ALIGN_MIDDLE)
				{
					y2 += (h - height) / 2;
				}
				else if (valign == mxConstants.ALIGN_BOTTOM)
				{
					y2 += h - height - vspacing;
				}
				else
				{
					y2 += vspacing;
				}
					
				c.save();
			
				var tmp = new shape();

				tmp.style = mxUtils.clone(this.style);
				tmp.direction = direction;
				tmp.updateTransform(c, x2, y2, width, height);
				shape.prototype.paintVertexShape.call(tmp, c, x2, y2, width, height);
				c.restore();
			}
				
			counter++;
		}
		while (shape != null);
	}
};

mxCellRenderer.registerShape('mxgraph.sysml.composite', mxShapeSysMLComposite);

//**********************************************************************************************************************************************************
//Package
//**********************************************************************************************************************************************************
/**
Extends mxShape.