/**
 * Copyright (c) 2006-2017, JGraph Ltd
 * Copyright (c) 2006-2017, Gaudenz Alder
 */
var mxClient =
{
	/**
	 * Class: mxClient
	 *
	 * Bootstrapping mechanism for the mxGraph thin client. The production version
	 * of this file contains all code required to run the mxGraph thin client, as
	 * well as global constants to identify the browser and operating system in
	 * use. You may have to load chrome://global/content/contentAreaUtils.js in
	 * your page to disable certain security restrictions in Mozilla.
	 * 
	 * Variable: VERSION
	 *
	 * Contains the current version of the mxGraph library. The strings that
	 * communicate versions of mxGraph use the following format.
	 * 
	 * versionMajor.versionMinor.buildNumber.revisionNumber
	 * 
	 * Current version is 3.7.5.
	 */
	VERSION: '3.7.5',

	/**
	 * Variable: IS_IE
	 *
	 * True if the current browser is Internet Explorer 10 or below. Use <mxClient.IS_IE11>
	 * to detect IE 11.
	 */
	IS_IE: navigator.userAgent.indexOf('MSIE') >= 0,

	/**
	 * Variable: IS_IE6
	 *
	 * True if the current browser is Internet Explorer 6.x.
	 */
	IS_IE6: navigator.userAgent.indexOf('MSIE 6') >= 0,

	/**
	 * Variable: IS_IE11
	 *
	 * True if the current browser is Internet Explorer 11.x.
	 */
	IS_IE11: !!navigator.userAgent.match(/Trident\/7\./),

	/**
	 * Variable: IS_EDGE
	 *
	 * True if the current browser is Microsoft Edge.
	 */
	IS_EDGE: !!navigator.userAgent.match(/Edge\//),

	/**
	 * Variable: IS_QUIRKS
	 *
	 * True if the current browser is Internet Explorer and it is in quirks mode.
	 */
	IS_QUIRKS: navigator.userAgent.indexOf('MSIE') >= 0 && (document.documentMode == null || document.documentMode == 5),

	/**
	 * Variable: IS_EM
	 * 
	 * True if the browser is IE11 in enterprise mode (IE8 standards mode).
	 */
	IS_EM: 'spellcheck' in document.createElement('textarea') && document.documentMode == 8,

	/**
	 * Variable: VML_PREFIX
	 * 
	 * Prefix for VML namespace in node names. Default is 'v'.
	 */
	VML_PREFIX: 'v',

	/**
	 * Variable: OFFICE_PREFIX
	 * 
	 * Prefix for VML office namespace in node names. Default is 'o'.
	 */
	OFFICE_PREFIX: 'o',

	/**
	 * Variable: IS_NS
	 *
	 * True if the current browser is Netscape (including Firefox).
	 */
  	IS_NS: navigator.userAgent.indexOf('Mozilla/') >= 0 &&
  		navigator.userAgent.indexOf('MSIE') < 0 &&
  		navigator.userAgent.indexOf('Edge/') < 0,

	/**
	 * Variable: IS_OP
	 *
	 * True if the current browser is Opera.
	 */
  	IS_OP: navigator.userAgent.indexOf('Opera/') >= 0 ||
  		navigator.userAgent.indexOf('OPR/') >= 0,

	/**
	 * Variable: IS_OT
	 *
	 * True if -o-transform is available as a CSS style, ie for Opera browsers
	 * based on a Presto engine with version 2.5 or later.
	 */
  	IS_OT: navigator.userAgent.indexOf('Presto/') >= 0 &&
  		navigator.userAgent.indexOf('Presto/2.4.') < 0 &&
  		navigator.userAgent.indexOf('Presto/2.3.') < 0 &&
  		navigator.userAgent.indexOf('Presto/2.2.') < 0 &&
  		navigator.userAgent.indexOf('Presto/2.1.') < 0 &&
  		navigator.userAgent.indexOf('Presto/2.0.') < 0 &&
  		navigator.userAgent.indexOf('Presto/1.') < 0,
  	
	/**
	 * Variable: IS_SF
	 *
	 * True if the current browser is Safari.
	 */
  	IS_SF: navigator.userAgent.indexOf('AppleWebKit/') >= 0 &&
  		navigator.userAgent.indexOf('Chrome/') < 0 &&
  		navigator.userAgent.indexOf('Edge/') < 0,
  	
	/**
	 * Variable: IS_IOS
	 * 
	 * Returns true if the user agent is an iPad, iPhone or iPod.
	 */
  	IS_IOS: (navigator.userAgent.match(/(iPad|iPhone|iPod)/g) ? true : false),
  		
	/**
	 * Variable: IS_GC
	 *
	 * True if the current browser is Google Chrome.
	 */
  	IS_GC: navigator.userAgent.indexOf('Chrome/') >= 0 &&
		navigator.userAgent.indexOf('Edge/') < 0,
	
	/**
	 * Variable: IS_CHROMEAPP
	 *
	 * True if the this is running inside a Chrome App.
	 */
  	IS_CHROMEAPP: window.chrome != null && chrome.app != null && chrome.app.runtime != null,
		
	/**
	 * Variable: IS_FF
	 *
	 * True if the current browser is Firefox.
	 */
  	IS_FF: navigator.userAgent.indexOf('Firefox/') >= 0,
  	
	/**
	 * Variable: IS_MT
	 *
	 * True if -moz-transform is available as a CSS style. This is the case
	 * for all Firefox-based browsers newer than or equal 3, such as Camino,
	 * Iceweasel, Seamonkey and Iceape.
	 */
  	IS_MT: (navigator.userAgent.indexOf('Firefox/') >= 0 &&
		navigator.userAgent.indexOf('Firefox/1.') < 0 &&
  		navigator.userAgent.indexOf('Firefox/2.') < 0) ||
  		(navigator.userAgent.indexOf('Iceweasel/') >= 0 &&
  		navigator.userAgent.indexOf('Iceweasel/1.') < 0 &&
  		navigator.userAgent.indexOf('Iceweasel/2.') < 0) ||
  		(navigator.userAgent.indexOf('SeaMonkey/') >= 0 &&
  		navigator.userAgent.indexOf('SeaMonkey/1.') < 0) ||
  		(navigator.userAgent.indexOf('Iceape/') >= 0 &&
  		navigator.userAgent.indexOf('Iceape/1.') < 0),

	/**
	 * Variable: IS_SVG
	 *
	 * True if the browser supports SVG.
	 */
  	IS_SVG: navigator.userAgent.indexOf('Firefox/') >= 0 || // FF and Camino
	  	navigator.userAgent.indexOf('Iceweasel/') >= 0 || // Firefox on Debian
	  	navigator.userAgent.indexOf('Seamonkey/') >= 0 || // Firefox-based
	  	navigator.userAgent.indexOf('Iceape/') >= 0 || // Seamonkey on Debian
	  	navigator.userAgent.indexOf('Galeon/') >= 0 || // Gnome Browser (old)
	  	navigator.userAgent.indexOf('Epiphany/') >= 0 || // Gnome Browser (new)
	  	navigator.userAgent.indexOf('AppleWebKit/') >= 0 || // Safari/Google Chrome
	  	navigator.userAgent.indexOf('Gecko/') >= 0 || // Netscape/Gecko
	  	navigator.userAgent.indexOf('Opera/') >= 0 || // Opera
	  	(document.documentMode != null && document.documentMode >= 9), // IE9+

	/**
	 * Variable: NO_FO
	 *
	 * True if foreignObject support is not available. This is the case for
	 * Opera, older SVG-based browsers and all versions of IE.
	 */
  	NO_FO: !document.createElementNS || document.createElementNS('http://www.w3.org/2000/svg',
  		'foreignObject') != '[object SVGForeignObjectElement]' || navigator.userAgent.indexOf('Opera/') >= 0,

	/**
	 * Variable: IS_VML
	 *
	 * True if the browser supports VML.
	 */
  	IS_VML: navigator.appName.toUpperCase() == 'MICROSOFT INTERNET EXPLORER',

	/**
	 * Variable: IS_WIN
	 *
	 * True if the client is a Windows.
	 */
  	IS_WIN: navigator.appVersion.indexOf('Win') > 0,

	/**
	 * Variable: IS_MAC
	 *
	 * True if the client is a Mac.
	 */
  	IS_MAC: navigator.appVersion.indexOf('Mac') > 0,

	/**
	 * Variable: IS_TOUCH
	 * 
	 * True if this device supports touchstart/-move/-end events (Apple iOS,
	 * Android, Chromebook and Chrome Browser on touch-enabled devices).
	 */
  	IS_TOUCH: 'ontouchstart' in document.documentElement,

	/**
	 * Variable: IS_POINTER
	 * 
	 * True if this device supports Microsoft pointer events (always false on Macs).
	 */
  	IS_POINTER: window.PointerEvent != null && !(navigator.appVersion.indexOf('Mac') > 0),

	/**
	 * Variable: IS_LOCAL
	 *
	 * True if the documents location does not start with http:// or https://.
	 */
  	IS_LOCAL: document.location.href.indexOf('http://') < 0 &&
  			  document.location.href.indexOf('https://') < 0,

	/**
	 * Function: isBrowserSupported
	 *
	 * Returns true if the current browser is supported, that is, if
	 * <mxClient.IS_VML> or <mxClient.IS_SVG> is true.
	 * 
	 * Example:
	 * 
	 * (code)
	 * if (!mxClient.isBrowserSupported())
	 * {
	 *   mxUtils.error('Browser is not supported!', 200, false);
	 * }
	 * (end)
	 */
	isBrowserSupported: function()
	{
		return mxClient.IS_VML || mxClient.IS_SVG;
	},

	/**
	 * Function: link
	 *
	 * Adds a link node to the head of the document. Use this
	 * to add a stylesheet to the page as follows:
	 *
	 * (code)
	 * mxClient.link('stylesheet', filename);
	 * (end)
	 *
	 * where filename is the (relative) URL of the stylesheet. The charset
	 * is hardcoded to ISO-8859-1 and the type is text/css.
	 * 
	 * Parameters:
	 * 
	 * rel - String that represents the rel attribute of the link node.
	 * href - String that represents the href attribute of the link node.
	 * doc - Optional parent document of the link node.
	 */
	link: function(rel, href, doc)
	{
		doc = doc || document;

		// Workaround for Operation Aborted in IE6 if base tag is used in head
		if (mxClient.IS_IE6)
		{
			doc.write('<link rel="' + rel + '" href="' + href + '" charset="UTF-8" type="text/css"/>');
		}
		else
		{	
			var link = doc.createElement('link');
			
			link.setAttribute('rel', rel);
			link.setAttribute('href', href);
			link.setAttribute('charset', 'UTF-8');
			link.setAttribute('type', 'text/css');
			
			var head = doc.getElementsByTagName('head')[0];
	   		head.appendChild(link);
		}
	},
	
	/**
	 * Function: include
	 *
	 * Dynamically adds a script node to the document header.
	 * 
	 * In production environments, the includes are resolved in the mxClient.js
	 * file to reduce the number of requests required for client startup. This
	 * function should only be used in development environments, but not in
	 * production systems.
	 */
	include: function(src)
	{
		document.write('<script src="'+src+'"></script>');
	},
	
	/**
	 * Function: dispose
	 * 
	 * Frees up memory in IE by resolving cyclic dependencies between the DOM
	 * and the JavaScript objects.
	 */
	dispose: function()
	{
		// Cleans all objects where listeners have been added
		for (var i = 0; i < mxEvent.objects.length; i++)
		{
			if (mxEvent.objects[i].mxListenerList != null)
			{
				mxEvent.removeAllListeners(mxEvent.objects[i]);
			}
		}
	}

};

/**
 * Variable: mxLoadResources
 * 
 * Optional global config variable to toggle loading of the two resource files
 * in <mxGraph> and <mxEditor>. Default is true. NOTE: This is a global variable,
 * not a variable of mxClient.
 *
 * (code)
 * <script type="text/javascript">
 * 		var mxLoadResources = false;
 * </script>
 * <script type="text/javascript" src="/path/to/core/directory/js/mxClient.js"></script>
 * (end)
 */
if (typeof(mxLoadResources) == 'undefined')
{
	mxLoadResources = true;
}

/**
 * Variable: mxForceIncludes
 * 
 * Optional global config variable to force loading the JavaScript files in
 * development mode. Default is undefined. NOTE: This is a global variable,
 * not a variable of mxClient.
 *
 * (code)
 * <script type="text/javascript">
 * 		var mxLoadResources = true;
 * </script>
 * <script type="text/javascript" src="/path/to/core/directory/js/mxClient.js"></script>
 * (end)
 */
if (typeof(mxForceIncludes) == 'undefined')
{
	mxForceIncludes = false;
}

/**
 * Variable: mxResourceExtension
 * 
 * Optional global config variable to specify the extension of resource files.
 * Default is true. NOTE: This is a global variable, not a variable of mxClient.
 *
 * (code)
 * <script type="text/javascript">
 * 		var mxResourceExtension = '.txt';
 * </script>
 * <script type="text/javascript" src="/path/to/core/directory/js/mxClient.js"></script>
 * (end)
 */
if (typeof(mxResourceExtension) == 'undefined')
{
	mxResourceExtension = '.txt';
}

/**
 * Variable: mxLoadStylesheets
 * 
 * Optional global config variable to toggle loading of the CSS files when
 * the library is initialized. Default is true. NOTE: This is a global variable,
 * not a variable of mxClient.
 *
 * (code)
 * <script type="text/javascript">
 * 		var mxLoadStylesheets = false;
 * </script>
 * <script type="text/javascript" src="/path/to/core/directory/js/mxClient.js"></script>
 * (end)
 */
if (typeof(mxLoadStylesheets) == 'undefined')
{
	mxLoadStylesheets = true;
}

/**
 * Variable: basePath
 *
 * Basepath for all URLs in the core without trailing slash. Default is '.'.
 * Set mxBasePath prior to loading the mxClient library as follows to override
 * this setting:
 *
 * (code)
 * <script type="text/javascript">
 * 		mxBasePath = '/path/to/core/directory';
 * </script>
 * <script type="text/javascript" src="/path/to/core/directory/js/mxClient.js"></script>
 * (end)
 * 
 * When using a relative path, the path is relative to the URL of the page that
 * contains the assignment. Trailing slashes are automatically removed.
 */
if (typeof(mxBasePath) != 'undefined' && mxBasePath.length > 0)
{
	// Adds a trailing slash if required
	if (mxBasePath.substring(mxBasePath.length - 1) == '/')
	{
		mxBasePath = mxBasePath.substring(0, mxBasePath.length - 1);
	}

	mxClient.basePath = mxBasePath;
}
else
{
	mxClient.basePath = '.';
}

/**
 * Variable: imageBasePath
 *
 * Basepath for all images URLs in the core without trailing slash. Default is
 * <mxClient.basePath> + '/images'. Set mxImageBasePath prior to loading the
 * mxClient library as follows to override this setting:
 *
 * (code)
 * <script type="text/javascript">
 * 		mxImageBasePath = '/path/to/image/directory';
 * </script>
 * <script type="text/javascript" src="/path/to/core/directory/js/mxClient.js"></script>
 * (end)
 * 
 * When using a relative path, the path is relative to the URL of the page that
 * contains the assignment. Trailing slashes are automatically removed.
 */
if (typeof(mxImageBasePath) != 'undefined' && mxImageBasePath.length > 0)
{
	// Adds a trailing slash if required
	if (mxImageBasePath.substring(mxImageBasePath.length - 1) == '/')
	{
		mxImageBasePath = mxImageBasePath.substring(0, mxImageBasePath.length - 1);
	}

	mxClient.imageBasePath = mxImageBasePath;
}
else
{
	mxClient.imageBasePath = mxClient.basePath + '/images';	
}

/**
 * Variable: language
 *
 * Defines the language of the client, eg. en for english, de for german etc.
 * The special value 'none' will disable all built-in internationalization and
 * resource loading. See <mxResources.getSpecialBundle> for handling identifiers
 * with and without a dash.
 * 
 * Set mxLanguage prior to loading the mxClient library as follows to override
 * this setting:
 *
 * (code)
 * <script type="text/javascript">
 * 		mxLanguage = 'en';
 * </script>
 * <script type="text/javascript" src="js/mxClient.js"></script>
 * (end)
 * 
 * If internationalization is disabled, then the following variables should be
 * overridden to reflect the current language of the system. These variables are
 * cleared when i18n is disabled.
 * <mxEditor.askZoomResource>, <mxEditor.lastSavedResource>,
 * <mxEditor.currentFileResource>, <mxEditor.propertiesResource>,
 * <mxEditor.tasksResource>, <mxEditor.helpResource>, <mxEditor.outlineResource>,
 * <mxElbowEdgeHandler.doubleClickOrientationResource>, <mxUtils.errorResource>,
 * <mxUtils.closeResource>, <mxGraphSelectionModel.doneResource>,
 * <mxGraphSelectionModel.updatingSelectionResource>, <mxGraphView.doneResource>,
 * <mxGraphView.updatingDocumentResource>, <mxCellRenderer.collapseExpandResource>,
 * <mxGraph.containsValidationErrorsResource> and
 * <mxGraph.alreadyConnectedResource>.
 */
if (typeof(mxLanguage) != 'undefined' && mxLanguage != null)
{
	mxClient.language = mxLanguage;
}
else
{
	mxClient.language = (mxClient.IS_IE) ? navigator.userLanguage : navigator.language;
}

/**
 * Variable: defaultLanguage
 * 
 * Defines the default language which is used in the common resource files. Any
 * resources for this language will only load the common resource file, but not
 * the language-specific resource file. Default is 'en'.
 * 
 * Set mxDefaultLanguage prior to loading the mxClient library as follows to override
 * this setting:
 *
 * (code)
 * <script type="text/javascript">
 * 		mxDefaultLanguage = 'de';
 * </script>
 * <script type="text/javascript" src="js/mxClient.js"></script>
 * (end)
 */
if (typeof(mxDefaultLanguage) != 'undefined' && mxDefaultLanguage != null)
{
	mxClient.defaultLanguage = mxDefaultLanguage;
}
else
{
	mxClient.defaultLanguage = 'en';
}

// Adds all required stylesheets and namespaces
if (mxLoadStylesheets)
{
	mxClient.link('stylesheet', mxClient.basePath + '/css/common.css');
}

/**
 * Variable: languages
 *
 * Defines the optional array of all supported language extensions. The default
 * language does not have to be part of this list. See
 * <mxResources.isLanguageSupported>.
 *
 * (code)
 * <script type="text/javascript">
 * 		mxLanguages = ['de', 'it', 'fr'];
 * </script>
 * <script type="text/javascript" src="js/mxClient.js"></script>
 * (end)
 * 
 * This is used to avoid unnecessary requests to language files, ie. if a 404
 * will be returned.
 */
if (typeof(mxLanguages) != 'undefined' && mxLanguages != null)
{
	mxClient.languages = mxLanguages;
}

// Adds required namespaces, stylesheets and memory handling for older IE browsers
if (mxClient.IS_VML)
{
	if (mxClient.IS_SVG)
	{
		mxClient.IS_VML = false;
	}
	else
	{
		// Enables support for IE8 standards mode. Note that this requires all attributes for VML
		// elements to be set using direct notation, ie. node.attr = value. The use of setAttribute
		// is not possible.
		if (document.documentMode == 8)
		{
			document.namespaces.add(mxClient.VML_PREFIX, 'urn:schemas-microsoft-com:vml', '#default#VML');
			document.namespaces.add(mxClient.OFFICE_PREFIX, 'urn:schemas-microsoft-com:office:office', '#default#VML');
		}
		else
		{
			document.namespaces.add(mxClient.VML_PREFIX, 'urn:schemas-microsoft-com:vml');
			document.namespaces.add(mxClient.OFFICE_PREFIX, 'urn:schemas-microsoft-com:office:office');
		}

		// Workaround for limited number of stylesheets in IE (does not work in standards mode)
		if (mxClient.IS_QUIRKS && document.styleSheets.length >= 30)
		{
			(function()
			{
				var node = document.createElement('style');
				node.type = 'text/css';
				node.styleSheet.cssText = mxClient.VML_PREFIX + '\\:*{behavior:url(#default#VML)}' +
		        	mxClient.OFFICE_PREFIX + '\\:*{behavior:url(#default#VML)}';
		        document.getElementsByTagName('head')[0].appendChild(node);
			})();
		}
		else
		{
			document.createStyleSheet().cssText = mxClient.VML_PREFIX + '\\:*{behavior:url(#default#VML)}' +
		    	mxClient.OFFICE_PREFIX + '\\:*{behavior:url(#default#VML)}';
		}
	    
	    if (mxLoadStylesheets)
	    {
	    	mxClient.link('stylesheet', mxClient.basePath + '/css/explorer.css');
	    }
	
		// Cleans up resources when the application terminates
		window.attachEvent('onunload', mxClient.dispose);
	}
}

// PREPROCESSOR-REMOVE-START
// If script is loaded via CommonJS, do not write <script> tags to the page
// for dependencies. These are already included in the build.
if (mxForceIncludes || !(typeof module === 'object' && module.exports != null))
{
// PREPROCESSOR-REMOVE-END
	mxClient.include(mxClient.basePath+'/js/util/mxLog.js');
	mxClient.include(mxClient.basePath+'/js/util/mxObjectIdentity.js');
	mxClient.include(mxClient.basePath+'/js/util/mxDictionary.js');
	mxClient.include(mxClient.basePath+'/js/util/mxResources.js');
	mxClient.include(mxClient.basePath+'/js/util/mxPoint.js');
	mxClient.include(mxClient.basePath+'/js/util/mxRectangle.js');
	mxClient.include(mxClient.basePath+'/js/util/mxEffects.js');
	mxClient.include(mxClient.basePath+'/js/util/mxUtils.js');
	mxClient.include(mxClient.basePath+'/js/util/mxConstants.js');
	mxClient.include(mxClient.basePath+'/js/util/mxEventObject.js');
	mxClient.include(mxClient.basePath+'/js/util/mxMouseEvent.js');
	mxClient.include(mxClient.basePath+'/js/util/mxEventSource.js');
	mxClient.include(mxClient.basePath+'/js/util/mxEvent.js');
	mxClient.include(mxClient.basePath+'/js/util/mxXmlRequest.js');
	mxClient.include(mxClient.basePath+'/js/util/mxClipboard.js');
	mxClient.include(mxClient.basePath+'/js/util/mxWindow.js');
	mxClient.include(mxClient.basePath+'/js/util/mxForm.js');
	mxClient.include(mxClient.basePath+'/js/util/mxImage.js');
	mxClient.include(mxClient.basePath+'/js/util/mxDivResizer.js');
	mxClient.include(mxClient.basePath+'/js/util/mxDragSource.js');
	mxClient.include(mxClient.basePath+'/js/util/mxToolbar.js');
	mxClient.include(mxClient.basePath+'/js/util/mxUndoableEdit.js');
	mxClient.include(mxClient.basePath+'/js/util/mxUndoManager.js');
	mxClient.include(mxClient.basePath+'/js/util/mxUrlConverter.js');
	mxClient.include(mxClient.basePath+'/js/util/mxPanningManager.js');
	mxClient.include(mxClient.basePath+'/js/util/mxPopupMenu.js');
	mxClient.include(mxClient.basePath+'/js/util/mxAutoSaveManager.js');
	mxClient.include(mxClient.basePath+'/js/util/mxAnimation.js');
	mxClient.include(mxClient.basePath+'/js/util/mxMorphing.js');
	mxClient.include(mxClient.basePath+'/js/util/mxImageBundle.js');
	mxClient.include(mxClient.basePath+'/js/util/mxImageExport.js');
	mxClient.include(mxClient.basePath+'/js/util/mxAbstractCanvas2D.js');
	mxClient.include(mxClient.basePath+'/js/util/mxXmlCanvas2D.js');
	mxClient.include(mxClient.basePath+'/js/util/mxSvgCanvas2D.js');
	mxClient.include(mxClient.basePath+'/js/util/mxVmlCanvas2D.js');
	mxClient.include(mxClient.basePath+'/js/util/mxGuide.js');
	mxClient.include(mxClient.basePath+'/js/shape/mxStencil.js');
	mxClient.include(mxClient.basePath+'/js/shape/mxShape.js');
	mxClient.include(mxClient.basePath+'/js/shape/mxStencilRegistry.js');
	mxClient.include(mxClient.basePath+'/js/shape/mxMarker.js');
	mxClient.include(mxClient.basePath+'/js/shape/mxActor.js');
	mxClient.include(mxClient.basePath+'/js/shape/mxCloud.js');
	mxClient.include(mxClient.basePath+'/js/shape/mxRectangleShape.js');
	mxClient.include(mxClient.basePath+'/js/shape/mxEllipse.js');
	mxClient.include(mxClient.basePath+'/js/shape/mxDoubleEllipse.js');
	mxClient.include(mxClient.basePath+'/js/shape/mxRhombus.js');
	mxClient.include(mxClient.basePath+'/js/shape/mxPolyline.js');
	mxClient.include(mxClient.basePath+'/js/shape/mxArrow.js');
	mxClient.include(mxClient.basePath+'/js/shape/mxArrowConnector.js');
	mxClient.include(mxClient.basePath+'/js/shape/mxText.js');
	mxClient.include(mxClient.basePath+'/js/shape/mxTriangle.js');
	mxClient.include(mxClient.basePath+'/js/shape/mxHexagon.js');
	mxClient.include(mxClient.basePath+'/js/shape/mxLine.js');
	mxClient.include(mxClient.basePath+'/js/shape/mxImageShape.js');
	mxClient.include(mxClient.basePath+'/js/shape/mxLabel.js');
	mxClient.include(mxClient.basePath+'/js/shape/mxCylinder.js');
	mxClient.include(mxClient.basePath+'/js/shape/mxConnector.js');
	mxClient.include(mxClient.basePath+'/js/shape/mxSwimlane.js');
	mxClient.include(mxClient.basePath+'/js/layout/mxGraphLayout.js');
	mxClient.include(mxClient.basePath+'/js/layout/mxStackLayout.js');
	mxClient.include(mxClient.basePath+'/js/layout/mxPartitionLayout.js');
	mxClient.include(mxClient.basePath+'/js/layout/mxCompactTreeLayout.js');
	mxClient.include(mxClient.basePath+'/js/layout/mxRadialTreeLayout.js');
	mxClient.include(mxClient.basePath+'/js/layout/mxFastOrganicLayout.js');
	mxClient.include(mxClient.basePath+'/js/layout/mxCircleLayout.js');
	mxClient.include(mxClient.basePath+'/js/layout/mxParallelEdgeLayout.js');
	mxClient.include(mxClient.basePath+'/js/layout/mxCompositeLayout.js');
	mxClient.include(mxClient.basePath+'/js/layout/mxEdgeLabelLayout.js');
	mxClient.include(mxClient.basePath+'/js/layout/hierarchical/model/mxGraphAbstractHierarchyCell.js');
	mxClient.include(mxClient.basePath+'/js/layout/hierarchical/model/mxGraphHierarchyNode.js');
	mxClient.include(mxClient.basePath+'/js/layout/hierarchical/model/mxGraphHierarchyEdge.js');
	mxClient.include(mxClient.basePath+'/js/layout/hierarchical/model/mxGraphHierarchyModel.js');
	mxClient.include(mxClient.basePath+'/js/layout/hierarchical/model/mxSwimlaneModel.js');
	mxClient.include(mxClient.basePath+'/js/layout/hierarchical/stage/mxHierarchicalLayoutStage.js');
	mxClient.include(mxClient.basePath+'/js/layout/hierarchical/stage/mxMedianHybridCrossingReduction.js');
	mxClient.include(mxClient.basePath+'/js/layout/hierarchical/stage/mxMinimumCycleRemover.js');
	mxClient.include(mxClient.basePath+'/js/layout/hierarchical/stage/mxCoordinateAssignment.js');
	mxClient.include(mxClient.basePath+'/js/layout/hierarchical/stage/mxSwimlaneOrdering.js');
	mxClient.include(mxClient.basePath+'/js/layout/hierarchical/mxHierarchicalLayout.js');
	mxClient.include(mxClient.basePath+'/js/layout/hierarchical/mxSwimlaneLayout.js');
	mxClient.include(mxClient.basePath+'/js/model/mxGraphModel.js');
	mxClient.include(mxClient.basePath+'/js/model/mxCell.js');
	mxClient.include(mxClient.basePath+'/js/model/mxGeometry.js');
	mxClient.include(mxClient.basePath+'/js/model/mxCellPath.js');
	mxClient.include(mxClient.basePath+'/js/view/mxPerimeter.js');
	mxClient.include(mxClient.basePath+'/js/view/mxPrintPreview.js');
	mxClient.include(mxClient.basePath+'/js/view/mxStylesheet.js');
	mxClient.include(mxClient.basePath+'/js/view/mxCellState.js');
	mxClient.include(mxClient.basePath+'/js/view/mxGraphSelectionModel.js');
	mxClient.include(mxClient.basePath+'/js/view/mxCellEditor.js');
	mxClient.include(mxClient.basePath+'/js/view/mxCellRenderer.js');
	mxClient.include(mxClient.basePath+'/js/view/mxEdgeStyle.js');
	mxClient.include(mxClient.basePath+'/js/view/mxStyleRegistry.js');
	mxClient.include(mxClient.basePath+'/js/view/mxGraphView.js');
	mxClient.include(mxClient.basePath+'/js/view/mxGraph.js');
	mxClient.include(mxClient.basePath+'/js/view/mxCellOverlay.js');
	mxClient.include(mxClient.basePath+'/js/view/mxOutline.js');
	mxClient.include(mxClient.basePath+'/js/view/mxMultiplicity.js');
	mxClient.include(mxClient.basePath+'/js/view/mxLayoutManager.js');
	mxClient.include(mxClient.basePath+'/js/view/mxSwimlaneManager.js');
	mxClient.include(mxClient.basePath+'/js/view/mxTemporaryCellStates.js');
	mxClient.include(mxClient.basePath+'/js/view/mxCellStatePreview.js');
	mxClient.include(mxClient.basePath+'/js/view/mxConnectionConstraint.js');
	mxClient.include(mxClient.basePath+'/js/handler/mxGraphHandler.js');
	mxClient.include(mxClient.basePath+'/js/handler/mxPanningHandler.js');
	mxClient.include(mxClient.basePath+'/js/handler/mxPopupMenuHandler.js');
	mxClient.include(mxClient.basePath+'/js/handler/mxCellMarker.js');
	mxClient.include(mxClient.basePath+'/js/handler/mxSelectionCellsHandler.js');
	mxClient.include(mxClient.basePath+'/js/handler/mxConnectionHandler.js');
	mxClient.include(mxClient.basePath+'/js/handler/mxConstraintHandler.js');
	mxClient.include(mxClient.basePath+'/js/handler/mxRubberband.js');
	mxClient.include(mxClient.basePath+'/js/handler/mxHandle.js');
	mxClient.include(mxClient.basePath+'/js/handler/mxVertexHandler.js');
	mxClient.include(mxClient.basePath+'/js/handler/mxEdgeHandler.js');
	mxClient.include(mxClient.basePath+'/js/handler/mxElbowEdgeHandler.js');
	mxClient.include(mxClient.basePath+'/js/handler/mxEdgeSegmentHandler.js');
	mxClient.include(mxClient.basePath+'/js/handler/mxKeyHandler.js');
	mxClient.include(mxClient.basePath+'/js/handler/mxTooltipHandler.js');
	mxClient.include(mxClient.basePath+'/js/handler/mxCellTracker.js');
	mxClient.include(mxClient.basePath+'/js/handler/mxCellHighlight.js');
	mxClient.include(mxClient.basePath+'/js/editor/mxDefaultKeyHandler.js');
	mxClient.include(mxClient.basePath+'/js/editor/mxDefaultPopupMenu.js');
	mxClient.include(mxClient.basePath+'/js/editor/mxDefaultToolbar.js');
	mxClient.include(mxClient.basePath+'/js/editor/mxEditor.js');
	mxClient.include(mxClient.basePath+'/js/io/mxCodecRegistry.js');
	mxClient.include(mxClient.basePath+'/js/io/mxCodec.js');
	mxClient.include(mxClient.basePath+'/js/io/mxObjectCodec.js');
	mxClient.include(mxClient.basePath+'/js/io/mxCellCodec.js');
	mxClient.include(mxClient.basePath+'/js/io/mxModelCodec.js');
	mxClient.include(mxClient.basePath+'/js/io/mxRootChangeCodec.js');
	mxClient.include(mxClient.basePath+'/js/io/mxChildChangeCodec.js');
	mxClient.include(mxClient.basePath+'/js/io/mxTerminalChangeCodec.js');
	mxClient.include(mxClient.basePath+'/js/io/mxGenericChangeCodec.js');
	mxClient.include(mxClient.basePath+'/js/io/mxGraphCodec.js');
	mxClient.include(mxClient.basePath+'/js/io/mxGraphViewCodec.js');
	mxClient.include(mxClient.basePath+'/js/io/mxStylesheetCodec.js');
	mxClient.include(mxClient.basePath+'/js/io/mxDefaultKeyHandlerCodec.js');
	mxClient.include(mxClient.basePath+'/js/io/mxDefaultToolbarCodec.js');
	mxClient.include(mxClient.basePath+'/js/io/mxDefaultPopupMenuCodec.js');
	mxClient.include(mxClient.basePath+'/js/io/mxEditorCodec.js');
// PREPROCESSOR-REMOVE-START
}
// PREPROCESSOR-REMOVE-END
